算法描述
输入:关系R和其上成立的函数依赖集F。
输出:又R分解出的关系集合,其中每个关系均属于3NF。分解具有无损链接和依赖保持性质。
方法:依次执行下列步骤:
- 找出F的一个最小基本集,记为G。
- 对于G中的每一个FD X→A,将XA作为分解出的某个关系的模式。
- 如果第2步分解出的关系的模式均不包含R的超键,则增加一个关系,其模式为R的任何一个键。
举例
《数据库系统基础教程 原书第3版》P60
习题3.3.1 对于下列的每个关系模式和FD集合:
a) R(A,B,C,D) FD{AB→C,C→D,D→A}
b) R(A,B,C,D) FD{B→C,B→D}
c) R(A,B,C,D) FD{AB→C,BC→D,CD→A,AD→B}
d) R(A,B,C,D) FD{A→B,B→C,C→D,D→A}
e) R(A,B,C,D,E) FD{AB→C,DE→C,B→D}
f) R(A,B,C,D,E) FD{AB→C,C→D,D→B,D→E}
做下列事情:
i) 指出所有的3NF违例。
ii) 如有必要,将关系分解为一系列属于3NF的关系。
a) R(A,B,C,D) FD{AB→C,C→D,D→A}
键:AB、BC、BD
主属性:A B C D
满足3NF
b) R(A,B,C,D) FD{B→C,B→D}
键:AB
主属性:B C
不满足3NF的FD:B→C,B→D,BC→D,BD→C
最小函数依赖集:B→C,B→D
故分解为BC,BD
均不包含R的超键,故增加AB
分解结果为BC,BD,AB
c) R(A,B,C,D) FD{AB→C,BC→D,CD→A,AD→B}
键:AB、BC、CD、AD
主属性:A B C D
满足3NF
d) R(A,B,C,D) FD{A→B,B→C,C→D,D→A}
键:A、B、C、D
主属性:A B C D
满足3NF
e) R(A,B,C,D,E) FD{AB→C,DE→C,B→D}
键:ABE
主属性:A B E
非主属性:C D
不满足3NF的FD:AB→C,DE→C,B→D,AB→D,BC→D,BE→C,BE→D,ABC→D,ABD→C,ADE→C,BCE→D,BDE→C
最小函数依赖集:AB→C,DE→C,B→D
故分解为ABC,CDE,BD
均不包含R的超键,故增加ABE
分解结果为ABC,CDE,BD,ABE
f) R(A,B,C,D,E) FD{AB→C,C→D,D→B,D→E}
键:AB、AC、AD
主属性:A B C D
不满足3NF的FD:C→E,D→E,BC→E,BD→E,CD→E,BCD→E
AB→E(AB→C,C→E)
AC→E(AC→D,D→E)
AD→E(AD→C,C→E)
最小函数依赖集:AB→C,C→D,D→B,D→E
故分解为ABC,CD,DB,DE
包含R的超键,即为分解结果