【软考】【数据库技术】规范化理论
函数依赖
价值与用途
非规范化的关系模式可能存在的问题:数据冗余、更新异常、插入异常、删除异常。
规范化的价值与用途就是解决非规范化理论存在的问题。
键
超键:唯一标识元祖的键
候选键:超键消除了多余的属性,形成候选键
生动比喻:有学号、姓名、性别三个字段,学号可以确定性别,学号和姓名的组合键也可以确定性别,学号和姓名的组合键可以称为超键,但不可以成为候选键,因为姓名和学号有一个是多余属性。
主键:候选键的其中任意一个
外键:其他关系的主键,因为有些时候需要对表做关联。
生动比喻:员工表中有一个字段是部门号,该字段用来和部门表进行关联,部门号对于员工表就是一个外键。
求候选键
将关系模式的函数依赖关系用“有向图”的方式表示。
找入度为0的属性,并以该属性集合为起点,尝试遍历有向图,若能正常遍历图中的所有结点,该属性集即为关系模式的个候选键。
若入度为0的属性集也不能遍历图中所有的结点,则需尝试性的将一些中间节点(既有入度,也有出度的结点)并入入度为0的属性集中,直至该集合能遍历所有结点,该集合为候选键。
例题:
1.用有向图表示后,A1的入度为0,从A1出发,沿A1-A2-A3-A2-A4发现可以遍历整个图,则A1为候选键。
2.用有向图表示后,ABDC的入度为0,候选键为ABCD的组合键,因为ABCD四个中的任意一个或几个键都不能遍历整个图,只有ABCD资格键的组合键才能遍历整个图。
注意:ABD→E和A→E、B→E、D→E的区别,前者是ABD的组合键可以确定E,后者是ABD中的任何一个都可以确定E,在有向图中的表示也有区别。
3.用有向图表示后,ABC入度都不为0,AB入度为1,则在AB中做考虑,从B出发可以遍历图,从A出发也可以遍历图,则A和B都为候选键
范式
第一范式(1NF):在关系模式R中,当且仅当所有域只包含原子值,即每个分量都是不可再分的数据项,则称R是第一范式。
上表所示的关系R不满足1NF,因为高级职称可以拆分成教授和副教授。只需删除高级职称项即可满足1NF
第二范式(2NF):当且仅当R是1NF时,且满足每一个非主属性完全依赖主键(即不存在部分依赖)时,称R是第二范式。
上表所示的关系R不满足2NF。SN0表示学号,CNO表示课程号,GRADE表示成绩,CREDIT表示学分。主键是学号和课程号的组合键,学号+课程号才能确定成绩。但是其存在部分依赖,即用学号可以确定学分,所以R不是2NF。
解决方案:在原关系R中删除CREDIT字段,再讲CNO与CREDIT重新组成一个新的关系。
第三范式(3NF):当且仅当R是2NF,且R中没有非主属性传递依赖码时,则称R是第三范式。
解决方案:将DNO、DNAME、LOCATION从原来的关系删除并重新组成新的关系。
BC范式(BCNF):消除主属性对候选键的传递依赖。设R是一个关系模式,F是它的依赖集,R属于BCNF当且仅当其F中每个依赖的决定因素必定包含R的某个候选码。
关系模式STJ中,S表示学生,T表示老师,J表示课程。每一个老师只教一门课程,每门课程有若干老师,某一学生选定某门课,就对应一个固定的老师。
所有函数依赖写出来,函数依赖的左边部分必须是候选键。SJ→T,T→J,T不是候选键,所以其不是BC范式。
例题:①消除非主属性对码的部分函数依赖,前提是主键是组合键,所以选C
②职工和部门是一种多对一的关系,建立职工和部门关系是要加在多的这一端,所以选D
③在第二问我们已经对职工号和部门号建立了关系,所以不需要增加部门号,排除CD,同时一个商品只能由一个部门进行销售,所以商品名称和商品号互为冗余,排除B,选A
模式分解
当范式级别不够的时候主要采取拆分模式的策略,拆分时需要考虑不同因素,有不同的原则。
保持函数依赖的分解:分解后函数依赖与分解前相同。比如R(A,B,C)存在函数依赖A→B,B→C,将R分解成R1(A,B),R2(B,C),此时R1保持A→B的函数依赖,R2保持B→C的函数依赖,所以R1和R2的分解是保持函数依赖分解。若R3(A,C),R1和R3的分解,不存在了B→C的函数依赖,所以R1,R3分解没有保持函数依赖。
无损联接分解:有损(不能还原),无损(可以还原)。将一个关系模式分解成若干个关系模式后,通过自然联接和投影等运算扔能还原到元老的关系模式。
判断无损分解:
方法一:
函数依赖:学号→姓名,课程号→课程名,(学号、课程号)→分数
原模式:成绩(学号,姓名,课程号,课程名,分数)
分解为:成绩(学号,课程号,分数);学生(学号,姓名);课程(课程号,课程名)
初始表如下:行表示原模式所有属性,列表示分解成的所有新表的名称,红色为新表中具有的原表的属性。
根据函数依赖对原表进行处理,从学号→姓名的关系将b12改成a2,从课程号→课程名的关系将b14改成a4,得到的新表中只要有一行全为a,则该分解为无损联接分解。
方法二:只适合一分为二的情况