【摘要】 如何设计一个好的表的结构
通过:关系数据库的规范化理论
我们简化一个 关系模式 R<U,F> :R是关系名称,U是属性组,F是数据依赖集
1NF
满足标准二维表(二维表每个分量必须是不可分开的数据项)就属于 1NF
数据依赖
是一个关系内部属性与属性之间的一种约束关系
通过属性间值的相等与否体现出来的数据间相互联系是现实世界属性间相互联系的抽象是数据内在的…
如何设计一个好的表的结构
通过:关系数据库的规范化理论
我们简化一个 关系模式
R<U,F> :R是关系名称,U是属性组,F是数据依赖集
1NF
满足标准二维表(二维表每个分量必须是不可分开的数据项)就属于 1NF
数据依赖
是一个关系内部属性与属性之间的一种约束关系
- 通过属性间值的相等与否体现出来的数据间相互联系
- 是现实世界属性间相互联系的抽象
- 是数据内在的性质
- 是语义的体现
分为函数依赖和多值依赖
一个糟糕的表结构的例子
建立一个描述学校教务的数据库。涉及的对象包括:
- 学号(Sno)
- 所在系(Sdept)
- 系主任姓名(Mname)
- 课程号(Cno)
- 成绩(Grade)
假设学校教务的数据库模式用一个单一的关系模式Student来表示,则该关系模式的属性集合为:
U ={Sno, Sdept, Mname, Cno, Grade}
现实世界的已知事实(语义): - 一个系有若干学生, 但一个学生只属于一个系;
- 一个系只有一名(正职)负责人;
- 一个学生可以选修多门课程,每门课程有若干学生选修;
- 每个学生学习每一门课程有一个成绩。
由此可得到属性组U上的一组函数依赖F:
F={Sno→Sdept, Sdept→ Mname, (Sno, Cno)→ Grade}
关系模式{Sno, Sdept, Mname, Cno, Grade}中存在的问题
(1)数据冗余
浪费大量的存储空间:每一个系主任的姓名重复出现
(2)更新异常(Update Anomalies)
更新数据时,维护代价大:某系更换系主任后,须修改有关的每一个元组。
(3)插入异常(Insertion Anomalies)
如果一个系刚成立,尚无学生,则无法把这个系及其系主任存入数据库。
(4)删除异常(Deletion Anomalies)
如果某个系的学生全部毕业了, 则在删除该系学生信息的同时,把这个系及其系主任的信息也丢掉了。
函数依赖
设R(U)是一个属性集U上的关系模式,X和Y是U的子集。
若
对于R(U)的任意一个可能的关系r,r 中不可能存在:
两个元组在X上的属性值相等,而在Y上的属性值不等,
则
称“X函数确定Y”或“Y函数依赖于X”,记作X→Y。
平凡函数依赖&非平凡函数依赖
x → y x\rightarrow y x→y
if y ⊆ x y\sube x y⊆x :平凡
else 非平凡
平凡函数依赖没啥用(相当于废话无用的话)
同时我们称x为决定因素
完全函数依赖&部分函数依赖
如果x存在一个真子集可以函数决定y,那么就是部分,记作
x → P y x \overset P\rightarrow y x→Py
如果x任意一个真子集都不能函数决定y,那么就是完全,记作
x → F y x \overset F\rightarrow y x→Fy
传递函数依赖
在R(U)中,如果X→Y(Y⊈X),Y↛X,Y→Z,Z⊈Y, 则称Z对X传递函数依赖。
记为:X → Z。
注: 如果Y→X, 即X←→Y,则Z直接依赖于X,而不是传递函数依赖
码
R<U,F>
若 K → F U K \overset F \rightarrow U K→FU ,则K是一个候选码
若 K → P U K \overset P \rightarrow U K→PU ,则K是超码
如果R中有多个候选码,则选定其中一个做为主码。
所谓非主属性,就是不包含在任何码中的属性(就是U-{所有码的并集})
所谓全码:整个属性组是码(任何U的真子集都不能是码)
范式
一个低一级范式的关系模式,通过模式分解可以转换为若干个高一级范式的关系模式的集合,这种过程就叫规范化。
2NF
在是1NF的基础上,若每一个非主属性都完全函数依赖一个码。
入若不符合2NF,可能会出现:插入异常,删除异常,修改复杂。
【没有非主属性的部分函数依赖】
解决方法:
用投影法分解关系模式
3NF
设关系模式R<U,F>∈1NF,若R中不存在这样的码X、属性组Y及非主属性Z (Y⊇ Z), 使得X→Y,Y→Z成立, X ↛ Y X\not\rightarrow Y X→Y不成立,
则称R<U,F> ∈ 3NF。
【不存在函数传递 码到非主属性】
BCNF
是修正的第三范式。
设关系模式R<U,F>∈1NF,若X →Y且Y ⊆ X时X必含有码,则R<U,F>∈BCNF。
换言之,在关系模式R<U,F>中,如果每一个决定属性集都包含候选码,则R∈BCNF。
【函数依赖的左边都含有码】
多值依赖
设R(U)是属性集U上的一个关系模式。X,Y,Z是U的子集,并且Z=U-X-Y。关系模式R(U)中多值依赖X→→Y成立,当且仅当对R(U)的任一关系r,给定的一对(x,z)值,有一组Y的值,这组值仅仅决定于x值而与z值无关。
就是x y z
一个x对应一组y无关z
平凡的:z是空集
非平凡:z不是空集
4NF
关系模式R<U,F>∈1NF,如果对于R的每个非平凡多值依赖X→→Y(Y ⊈ X),X都含有码,则R<U,F>∈4NF。
规划化
闭包求码
所谓闭包:就是由一个属性直接或间接推导出的所有属性的集合。
例如
算法步骤:
首先写出划分属性
L:属性只出现在函数依赖左部
R:属性只出现在函数依赖右部
LR:属性出现在函数依赖左部和右部
N:属性未出现在函数依赖中
定理1:对于给定的关系模式R及其函数依赖集F,若X(X∈R)是L类属性,则X必为R的任一候选码的成员。
推论1:
对于给定的关系模式R及其函数依赖集F,
若X(X∈R)是L类属性,且X+包含了R的全部属性;
则X必为R的唯一候选码。
定理2:对于给定的关系模式R及其函数依赖集F,
若X(X∈R)是R类属性,则X不在任何候选码中。
定理3:对于给定的关系模式R及其函数依赖集F,
若X(X∈R)是N类属性,则X必包含在R的任一候选码中。
推论2:对于给定的关系模式R及其函数依赖集F,
若X(X∈R)是L类和N类组成的属性集,且X+包含了R的全部属性;则X是R的唯一候选码。
ABCDEF 六个属性
如果L=AB 令K=AB
如果K的闭包=U,则AB就是码;
否则
让我们举个例子
以D未最基本的码的元素,开始加别的属性,算闭包。
得到DA+=U,这个时候我们不能停止,继续算DB,(也就是说算到两个属性是码,继续尝试两个属性的组合),但是不用算包含DB的了(因为将会是超码),但是DB+仍然不是闭包,我们需要继续以DB为基本属性,继续添加属性算闭包。
文章来源: blog.csdn.net,作者:梁默申,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/Chantec/article/details/116245160