怎样分析数据库冗余范式数据冗余问题

【SQL Server】(8)
【自学考试】(1)
&&&&& 看了看第一次机房收费系统的数据库,感觉存在很多问题,最多的问题就是数据冗余,所以想在第二次机房的时候把数据库设计的尽可能完美,正好也是对数据库考试的一个总结,首先是对我当时最头疼的范式的总结,范式的作用就是消除数据冗余、更新异常、插入异常和删除异常。
一、相关概念及知识点:
& &1.数据依赖:反映一个关系内部属性与属性之间的约束关系,是现实世界属性间相互联系的抽象,属于数据内在的性质和语义的体现。
& & 2. 规范化理论:是用来设计良好的关系模式的基本理论。它通过分解关系模式来消除其中不合适的数据依赖,以解决插入异常、删除异常、更新异常和数据冗余问题。
& & 3. 函数依赖(Functional Dependency FD):简单地说,对于关系模式的两个属性子集X和Y,若X的任一取值能唯一确定Y的值,则称Y函数依赖于X,记作X→Y。
& & 4. 非平凡函数依赖:对于关系模式的两个属性子集X和Y,如果X→Y,但Y!?X,则称X→Y为非平凡函数依赖;如果X→Y,但Y?X,则称X→Y为非平凡函数依赖。
& & 5. 完全函数依赖:对于关系模式的两个属性子集X和Y,如果X→Y,并且对于X的任何一个真子集X',都没有X'→Y,则称Y对X完全函数依赖;如果X→Y,但Y不完全函数依赖于X,则称Y对X部分函数依赖。
二、范式的概念
如果一个关系模式R的所有属性都是不可分的基本数据项,则R∈1NF。
数据库表中的字段都是单一属性的,不可再分。
不满足第一范式就不是关系型数据库!
若关系模式R∈1NF,并且每一个非主属性都完全函数依赖于R的码,则R∈2NF
表中的属性必须完全依赖于全部主键,而不是部分主键。所以只有一个主键的表如果符合第一范式,那一定是第二范式。
在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。
所谓传递函数依赖,指的是如果存在&A → B → C&的决定关系,则C传递函数依赖于A。
BCNF(鲍依斯-科得范式)
在第三范式的基础上,数据库表中如果不存在任何字段对任一候选关键字段的传递函数依赖则符合BC范式。
三、范式的发展
四、范式的目标
& & & 应用数据库范式可以带来许多好处,但是最重要的好处归结为三点:
& & & 1.减少数据冗余(这是最主要的好处,其他好处都是由此而附带的)
& & & 2.消除异常(插入异常,更新异常,删除异常)
五、范式的举例
第二范式(2NF):
数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖(部分函数依赖指的是存在组合关键字中的某些字段决定非关键字段的情况),也即所有非关键字段都完全依赖于任意一组候选关键字。
& & &假定选课关系表为SelectCourse(学号, 姓名, 年龄, 课程名称, 成绩, 学分),关键字为组合关键字(学号, 课程名称),因为存在如下依赖关系:
& & &(学号, 课程名称) → (姓名, 年龄, 成绩, 学分)
& & &这个数据库表不满足第二范式,因为存在如下依赖关系:
& & &(课程名称) → (学分)
& & &(学号) → (姓名, 年龄)
即存在组合关键字中的字段决定非关键字的情况。
& & &由于不符合2NF,这个选课关系表会存在如下问题:
& & &(1) 数据冗余:
& & &同一门课程由n个学生选修,&学分&就重复n-1次;同一个学生选修了m门课程,姓名和年龄就重复了m-1次。
& & &(2) 更新异常:
& & &若调整了某门课程的学分,数据表中所有行的&学分&值都要更新,否则会出现同一门课程学分不同的情况。
& & &(3) 插入异常:
& & &假设要开设一门新的课程,暂时还没有人选修。这样,由于还没有&学号&关键字,课程名称和学分也无法记录入数据库。
& & &(4) 删除异常:
& & &假设一批学生已经完成课程的选修,这些选修记录就应该从数据库表中删除。但是,与此同时,课程名称和学分信息也被删除了。很显然,这也会导致插入异常。把选课关系表SelectCourse改为如下三个表:
& & &学生:Student(学号, 姓名, 年龄);
& & &课程:Course(课程名称, 学分);
& & &选课关系:SelectCourse(学号, 课程名称, 成绩)。
& & &这样的数据库表是符合第二范式的,消除了数据冗余、更新异常、插入异常和删除异常。
& & &另外,所有单关键字的数据库表都符合第二范式,因为不可能存在组合关键字。
&第三范式(3NF):
在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。所谓传递函数依赖,指的是如果存在&A → B → C&的决定关系,则C传递函数依赖于A。因此,满足第三范式的数据库表应该不存在如下依赖关系:
& & &关键字段 → 非关键字段x → 非关键字段y
& & &假定学生关系表为Student(学号, 姓名, 年龄, 所在学院, 学院地点, 学院电话),关键字为单一关键字&学号&,因为存在如下决定关系:
& & &(学号) → (姓名, 年龄, 所在学院, 学院地点, 学院电话)
这个数据库是符合2NF的,但是不符合3NF,因为存在如下决定关系:
& & &(学号) → (所在学院) → (学院地点, 学院电话)
即存在非关键字段&学院地点&、&学院电话&对关键字段&学号&的传递函数依赖。
& & &它也会存在数据冗余、更新异常、插入异常和删除异常的情况,读者可自行分析得知。
& & &把学生关系表分为如下两个表:
& & &学生:(学号, 姓名, 年龄, 所在学院);
& & &学院:(学院, 地点, 电话)。
这样的数据库表是符合第三范式的,消除了数据冗余、更新异常、插入异常和删除异常。
小结:自考虽然考完了,但是还是需要总结的,不仅仅是对知识的梳理,更是对即将到来的机房重构打良好的基础。希望指出不足之处!
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:46316次
积分:4329
积分:4329
排名:第5521名
原创:106篇
评论:1687条
阅读:4563数据库三范式_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
数据库三范式
上传于||文档简介
&&数​据​库​三​范​式
阅读已结束,如果下载本文需要使用2下载券
想免费下载本文?
定制HR最喜欢的简历
你可能喜欢1943人阅读
【Database】(8)
设计关系型数据库时,遵从不同的规范要求,设计出合理的关系型数据库。这些规范被称作范式。越高的范式数据库的冗余度就越低。
目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴德斯科范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)
满足第二范式一定满足第一范式,满足第三范式一定满足第二范式,依次类推。。。
关系型数据库的最低要求是满足第一范式。一般来讲,数据库满足到第三范式就行了。
第一范式(1NF)无重复的列
数据库表的每一列都是不可分割的原子数据项,而不能是集合,数组,记录等非原子数据项。如果实体中的某个属性有多个值时,必须拆分为不同的属性
在任何一个关系数据库中,第一范式(1NF)是对关系模式的设计基本要求,一般设计中都必须满足第一范式(1NF)。不过有些关系模型中突破了1NF的限制,这种称为非1NF的关系模型。换句话说,是否必须满足1NF的最低要求,主要依赖于所使用的关系模型。
第二范式(2NF)属性完全依赖于主键
第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。
当存在多个主键的时候,才会发生不符合第二范式的情况。比如现在有两个主键,不能存在这样的属性,它只依赖于其中一个主键,这就是不符合第二范式。
如果存在不符合第二范式的情况,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。
第三范式(3NF)属性不能传递依赖于主属性(属性不依赖于其它非主键属性)
第二范式(3NF)是在第一范式(2NF)的基础上建立起来的,即满足第二范式(3NF)必须先满足第一范式(2NF)。
如果某一属性依赖于其他非主键属性,而其他非主键属性又依赖于主键,那么这个属性就是间接依赖于主键,这被称作传递依赖于主属性。
下面以一个学校的学生系统为例分析说明这几个范式的应用。首先我们确定一下要设计的内容包括那些。学号、姓名、年龄、性别、电话、系别、系办地址、系办电话、课程、学分、成绩,等信息。
第一范式举例
在当前的任何关系数据库管理系统(DBMS)中,傻瓜也不可能做出不符合第一范式的数据库,因为这些DBMS不允许你把数据库表的一列再分成二列或多列。因此,你想在现有的DBMS中设计出不符合第一范式的数据库都是不可能的。
虽然第一范式一定是满足的,但是为了加强理解,还是举例说明一下
如果在某个学生的“电话”属性中填入了“ 025-”,那么就违反了第一范式。学生电话属性违反了原子性,它还可以再分,分成手机和座机两个属性。
第二范式举例
我们把(学号、姓名、年龄、性别、电话、系别、系办地址、系办电话、课程、学分、成绩)这些信息放到一个表中,其中“学生学号”和“课程”两个属性是主键。
这样不符合第二范式。出现了属性依赖于部分主键的情况(比如”姓名“只依赖于”学号“,和“课程”属性无关)
那么违反了第二范式有什么问题呢?下面来分析一下:
数据冗余:同一门课程由n个学生选修,&学分&就重复n-1次;同一个学生选修了m门课程,“姓名”和“年龄”就重复了m-1次。
更新异常:1)若调整了某门课程的学分,数据表中所有行的&学分&值都要更新,否则会出现同一门课程学分不同的情况。
2)假设要开设一门新的课程,暂时还没有人选修。这样,由于还没有&学号&关键字,课程名称和学分也无法记录入数据库。
删除异常 :假设一批学生已经完成课程的选修,这些选修记录就应该从数据库表中删除。但是,与此同时,课程名称和学分信息也被删除了。很显然,这也会导致插入异常。
解决方案 :
分成三个表:
学生:Student(学号,姓名,年龄,性别,电话,系别,系办地址、系办电话)
课程:Course(课程,学分)
选课关系:SelectCourse(学号,课程,成绩)
第三范式举例
继续看上面改善过了的关系结构。由于Student表只有一个主键“学号”,所以存在如下决定关系:
(学号)→ (姓名,年龄,性别,电话,系别,系办地址、系办电话)
但是还存在下面的决定关系:
(学号) → (系别)→(系办地点,系办电话)
即存在非关键字段&系办地点&、&系办电话&对关键字段&学号&的传递依赖。它也会存在数据冗余、更新异常、插入异常和删除异常的情况(这里不作分析,可以参照第二范式的分析)
解决方案:
继续把学生表分成两个表:
学生:(学号,姓名,年龄,性别,电话,系别)   
系别:(系别,系办地址,系办电话)
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:369299次
积分:4228
积分:4228
排名:第5720名
原创:74篇
转载:19篇
评论:63条
(3)(6)(1)(1)(3)(1)(2)(8)(1)(2)(13)(1)(2)(10)(4)(6)(15)(14)}

我要回帖

更多关于 数据库减少了数据冗余 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信