从学生信息管理系统开始就一直在不间断的与数据库打交道,从Access到SQL,从机房到重构,从数据库理论原理到软考之路。对于数据库规范化不断在强调,却又不断对这些知识从模糊到明了的无线循环。在反复的落下和拾起中,不断温故知新,每一次接触都比上一次来得更真切可感。
数据库规范化中,笔者分别从重点知识键、函数依赖、范式进行梳理,有不同意见多多指教。
1)超键:唯一确定其他属性的集合
2)候选键:剔除超键里唯一确定集合中多余属性的属性集
3)主键:候选键挑选出来的
4)外键:外来客,B的主键跑到A中当期外键。
举例说明:
(学号,姓名,性别)假定学生不重名:
超键 :(学号,姓名),(学号,性别),(学号,姓名,性别),均可唯一确定该字段中任何一条记录。
候选键:(学号,姓名)
主键 :学号或者姓名。候选键中打败众多候选人,脱颖而出者。
1)函数依赖:
某一属性能确定另外一个属性就叫做函数依赖,
例如:学号能确定姓名,就说姓名函数依赖于学号
但年龄,不能确定他叫什么,故年龄和姓名之间不存在函数依赖。
2)完全函数依赖:
xy的集合能推出 z,但是将xy拆分开来,但中任意一个都无法推出z,就说明z完全依赖于xy。
3)部分函数依赖:
与完全依赖相反,xy推出z,但分开之后,例如x仍可推出z,这就属于部分函数依赖。
4)传递依赖:
X推出y,y推出z,x推出z
1NF:不含可拆分属性
(学号,姓名,性别,联系方式)
由于联系方式可以有QQ、飞信、手机号等等,所以联系方式就是可再拆分的属性。故上述设计不符合INF.
2NF:消除部分函数依赖。
(学号,课程号,成绩,学分)
学号和课程号,一同确定学生的成绩和该科学分。拆开学号和课程号,均无法唯一确定,谁哪一个得了都少分。所以该设计符合2NF
3NF:消除传递依赖
(学号,系别,系地址)
学号确定学生所在系别,而系别又可以确定该系地址。这就造成了传递依赖。不符合3NF,可进行拆分,拆分成(学号,系别)、(系别,系地址),形成多张表来消除传递依赖。
在今后的系统设计中,任何一个项目都离不开数据库设计,所以逐渐一步一步的将意识和行为同步,不断更趋向于专业化,设计出一个健壮的后台数据库,才能位系统减负,也是设计者专业素养和智慧的体现。