数据设计常见问题
- 数据冗余
- 更新异常
- 插入/删除异常
无损连接分解
分解后的两张表自然连接后能得到原来的表叫做无损连接
重点是作为连接的属性必须是R1或R2的码,具有不可重复性
函数依赖
若A属性值确定了,则B属性值也唯一确定了,于是就有A→B
对所有关系都满足的函数依赖称为平凡的
平凡依赖
定义:
若X->Y,且Y是X的子集(对任一关系模式,平凡函数依赖必然成立),就是平凡函数依赖。
例如:
在学生表(学号,姓名,年级)中,(学号,姓名)可以推出学号和姓名其中的任何一个,这就是平凡函数依赖.
直白点说,就是只要Y是X的子集,Y就依赖于X。
非平凡依赖
定义:
若X→Y,但Y不是X的子集,就是非平凡函数依赖。
例如:
在学生表(学号,姓名,年级)中,通过(学号,姓名)可以推出这个学生所在的年级,但年级不是(学号,姓名)的子集,这是非平凡函数依赖.((学号,姓名)就是一个x,学号或者姓名就是一个x')。
候选码
本身是一个超码,但是它的任意子集不能是码
保持依赖
如果F上的每一个函数依赖都在R1或者R2上成立,则这个分解是保持依赖的
数据库范式
- 1NF:属性不可分
- 2NF:消除非主属性对于码的部分函数依赖
- 3NF:消除非主属性对于码的传递函数依赖
- BCNF: 消除主属性对于码的部分与传递函数依赖
BCNF分解算法
下面以 R(A, B, C, D), FD{AB→C, C→D, D→A}为例
先列出所有非平凡依赖
C→A, C→D
D→A
AB→C, AB→D
AC→D
BC→A
BD→A, BD→C
CD→A
ABC→C, ABC→C
BCD→A
找到所有键
由上面的所有平凡依赖可以找出所有键:AB, BC, BD
找出所有违反BCNF的FD(左边不包含键)
C→A, C→D, D→A, AC→D, CD→A
分解违反BCNF的依赖
从C→D开始分解,C+ = ACD
得到R1 = C+ = ACD,R2 = BC
其中BC是二元的,满足BCNF
对ACD,有D→A不符合BCNF,故仍需要分解
分解为AD和CD
所以分解结果为AD, CD, BC
网友评论