模式设计
1、函数依赖的概念
2、最小函数依赖集*
3、码的形式化定义*
4、1NF、2NF、3NF、BCNF*
5、无损并且保持函数依赖分解到3NF的算法*
6、无损分解到BCNF的算法
————————
7、数据库设计过程以及各个过程的主要工作
8、ER设计的基本方法
9、逻辑设计的主要工作
10、ER模型到关系模型的转换方法
一、关系模式的分解
关系模式设计不规范会引起的问题(回顾第一章最后)
- 数据冗余
- 更新异常
- 插入异常
- 删除异常
1.1 模式分解概念
概念
- 设有关系模式
R(U)和R1(U1), R2(U2), …, Rk(Uk)
,其中U=U1 ∪ U2 … ∪ Uk, 设 ρ={R1, R2,…, Rk}
,则称ρ
为R的一个分解 - 理解模式分解的含义
- 属性集的分解
- 函数依赖集的分解
1.2 模式分解标准
- 无损连接
- 保持函数依赖
- 既无损连接又保持函数依赖
1.2.1 无损连接(Lossless Join)
概念和理解
- 设R是关系模式,分解成关系模式
ρ={R1, R2,…, Rk}
,F是R上的一个FD集, 若对R中满足F的每个关系r,都有:r=ΠR1(r) ⋈ ΠR2(r) ⋈ … ⋈ ΠRk(r)
, 则 称这个分解ρ
相对于F是“无损连接分解” - R的每个关系r是它在Ri上的投影的自然联接
- 无损连接保证R分解后还可以通过Ri恢复(最直观理解)
无损连接的测试
分解为两个关系模式的情形。直观理解就是交集要含有F左边的属性集,这样交集可以决定除去交集剩余部分的属性。
R分解成n (n > 2) 个关系模式的情形:Chase方法,参考《数据库系统概念》
1.2.2 保持函数依赖(Preserve Dependency)
形式化定义
直观理解就是把属性集分成几块不会把函数依赖中间的箭头→
扯断
不保持函数依赖会造成的问题:语义完整性被破坏
(直观理解就是丢失了一个FD导致FD包含的语义(依赖关系)没了)
二、关系模式的范式
范式概念:满足特定要求的模式
- 不同级别的范式要求各不相同
- 范式可以作为衡量一个关系模式好坏的标准
- 若关系模式R满足范式xNF,记
R∈xNF(用属于“∈”表示)
规范化:将低一级范式的关系模式通过模式分解转 换为高一级范式的关系模式集合的过程
函数依赖图(不知道用来干嘛的先放在这)
关系模式范式级别
1NF
定义:对于关系模式R的任一实例,其元组的每一个 属性值都只含有一个值,则R∈1NF
1NF是关系的基本要求
2NF
定义
- 当且仅当R属于1NF,且R的每一个非主属性 都完全函数依赖于主码时,R∈2NF
- 注意是完全依赖,若主码中的部分属性就能决定一个非主属性(非主属性局部依赖于主码)也不满足2NF
- 主属性可以局部依赖于主码
完全函数依赖:对于函数依赖W→A
,若不存在X⊂W
,并且X→A
成立,则称W→A
为完全函数依赖,否则为局部函数依赖
例子:供应关系
R(S#, P#, city, status, Price, QTY)
F={S## → city, S## → status , P## → Price, city → status, {S#,P#} → QTY }
模式分解到2NF:不扯断函数依赖,把局部依赖关系自己划成一个模式。
3NF
定义
- 当且仅当R属于2NF,且R的每一个非主属性 都不传递依赖于主码主属性时,
R∈3NF
- 等效理解为不允许《非主属性》到《非码》的FD?不应该是《非码》到《非主属性》的FD吗(网上查到非码属性就是非主属性)
传递依赖:若Y→X
,X→A
,并且X→Y
,A不是X 的子集,则称A传递依赖于Y
2NF分解到3NF:去掉传递依赖
BCNF
BCNF的观点
- 2NF和3NF
- 假设了R只有一个候选码,但一般情况下R可能有多个候选 码,并且不同的候选码之间还可能相互重叠
- 只考虑了非主属性到码的函数依赖
- BCNF扩充了3NF,可以处理R有多个候选码的情形
- 进一步考虑了主属性到码的函数依赖
- 进一步考虑了主属性对非主属性的函数依赖
定义
- (C.J. Date)如果关系模式R的所有不平凡的、完 全的函数依赖的决定因素(左边的属性集)都是候 选码,则R∈BCNF
- (萨 & 王)关系模式
R ∈1NF
,若R中的任一函数 依赖X → Y
且Y !⊆ X
时X必包含候选码,则R∈BCNF
3NF:不允许非主属性到非码的FD,但允许主属性到其它 属性的FD(“X到Y的FD” = Y → X
??)
BCNF:不允许主属性、非主属性到非码的FD
人话就是,函数依赖左边必然都是码
分解到BCNF不一定能保持函数依赖
三、模式分解的算法
3.1 保持函数依赖地分解到3NF的算法
- 求出最小依赖集F
- 把F涉及的属性划到一边R,没涉及的划另一边R'
- 把R中属性按F左边相同的分组,把子集去掉。剩下的加上R'就是结果
3.2 无损并且保持函数依赖分解为3NF的算法
- 首先用算法1求出R的保持函数依赖的3NF 分解,设为q={R1,R2,…,Rk} ===> 已经得到保持依赖的3NF
- 设X是R的码,求出
p=q ∪{R(X)}
- 若X是q中某个Ri的子集,则在p中去掉R(X)
- 得到的p就是最终结果
人话:在保持函数依赖的3NF模式中,若主码模式R(X)还没被某个模式包含,就加上去
3.3 无损分解为BCNF的算法
不用先确认模式R是不是已经符合2NF或者3NF,没有前置要求,直接一步到位从1NF变成BCNF