代码学堂(uxuew.cn)提供付费解决PHP WEB开发等技术服务,如果需要请 点击加我QQ:1662935793.
>数据库 > MySQL教程 > 数据库设计三范式及反三范式应用场景详解

数据库设计三范式及反三范式应用场景详解

MySQL教程 围观3682次 更新日期:2017-06-28 22:34:56 留下足迹

1、数据库命名规范
一个项目组内所有设计数据库的程序员应当共同遵守统一的“数据库命名规范”。在本书的附录B中,我们提供了一个“数据库命名规范”实例,供大家参考。
2、数据库设计范式
关系数据库设计之时是要遵守一定的规则的。尤其是数据库设计范式,接下来简单介绍1NF(第一范式),2NF(第二范式),3NF(第三范式)和BCNF,另外还有第四范式和第五范式。在你设计数据库时,若能符合这几个范式,你就是数据库设计的高手。
(1)第一范式(1NF)
数据库表中的字段都是单一属性的,不可再分。这个单一属性由基本类型构成,包括整型、实数、字符型、逻辑型、日期型等。
例如,电话的字段就可能不符合第一正规化,因为每个人可能有一个以上的电话需要记录,这时最简单的做法就是将字段增加,不要用电话当字段名称,用家里电话、手机、办公室电话、分机号码、宿舍电话等。

(2)第二范式(2NF)
规则是符合第一范式,而且没有部分主键功能决定其他属性的现象,也就是主键之外的其他属性都完全的功能相依于主键。
假定选课关系表为SelectCourse(学号,姓名,年龄,课程名称,成绩,学分),关键字为组合关键字(学号,课程名称),因为存在如下决定关系:(学号,课程名称)→(姓名,年龄,成绩,学分)。
这个数据库表不满足第二范式,因为存在如下决定关系:
(课程名称)→(学分),即知道课程,就可以知道该课程的学分。
(学号)→(姓名,年龄),即知道了学号,就可以知道该学生的姓名和年龄。
① 数据冗余
同一门课程由n个学生选修,“学分”就重复n?1次;同一个学生选修了m门课程,姓名和年龄就重复了m?1次。
② 更新异常
若调整了某门课程的学分,数据表中所有行的“学分”值都要更新,否则会出现同一门课程学分不同的情况。
③ 插入异常
假设要开设一门新的课程,暂时还没有人选修。这样,由于还没有“学号”关键字,课程名称和学分也无法记录入数据库。
④ 删除异常
假设一批学生已经完成课程的选修,这些选修记录就应该从数据库表中删除。但是,与此同时,课程名称和学分信息也被删除了。很显然,这也会导致插入异常。
把选课关系表SelectCourse改为如下三个表。
学生:Student(学号,姓名,年龄)
课程:Course(课程名称,学分)
选课关系:SelectCourse(学号,课程名称,成绩)
这样的数据库表是符合第二范式的,消除了数据冗余、更新异常、插入异常和删除异常。
(3)第三范式(3NF)
在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。
所谓传递函数依赖,指的是如果存在“A→B→C”的决定关系,则C传递函数依赖于A。因此,满足第三范式的数据库表应该不存在如下依赖关系:关键字段→非关键字段x→非关键字段y。
假定学生关系表为Student(学号,姓名,年龄,所在学院,学院地点,学院电话),关键字为单一关键字“学号”,因为存在如下决定关系:
(学号)→(姓名,年龄,所在学院,学院地点,学院电话)
这个数据库是符合2NF的,但是不符合3NF,因为存在如下决定关系:
(学号)→(所在学院)→(学院地点,学院电话)
把学生关系表分为如下两个表。
学生:(学号,姓名,年龄,所在学院);
学院:(学院,地点,电话)。
(4)BCNF范式
BCNF范式(Boyce/Codd Normal Form),是由R.F.Boycy和E.F. Codd共同提出的,可以算成是第三正则化的补充,规则是符合第三正则化原则,并且没有非主键属性可以功能性决定部分主键的现象。
假设有一个表R,其中的属性有A,B,C,D,E,以A和B为复合主键,R={A,B,C,D,E},如果存在有非主键属性,比如说C可以功能性决定B,C→B,而B是主键的一部分,这时第三正则化是没有办法分辨出来这种错误的,所以有BCNF正则化规则来把关,同样地,BCNF正则化的方法也是将原来的表拆开,成立一个新的关联表R1来装C→B,R1={C,B},但原来的表R还是以(A,B)为复合主键,以B为外键关联到新的表去,以保留原有的信息。
R={A,B,D,E},R1={C,B},R.B=R1.B

转载请注明:代码学堂>数据库 > MySQL教程 > 数据库设计三范式及反三范式应用场景详解

喜欢 (832) or 分享 (137)