Skip to content

模式设计

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恢复(最直观理解)

image.png

无损连接的测试

分解为两个关系模式的情形。直观理解就是交集要含有F左边的属性集,这样交集可以决定除去交集剩余部分的属性。

image.png

R分解成n (n > 2) 个关系模式的情形:Chase方法,参考《数据库系统概念》

1.2.2 保持函数依赖(Preserve Dependency)

形式化定义

直观理解就是把属性集分成几块不会把函数依赖中间的箭头扯断

image.png

不保持函数依赖会造成的问题:语义完整性被破坏

(直观理解就是丢失了一个FD导致FD包含的语义(依赖关系)没了)

image.png

二、关系模式的范式

范式概念:满足特定要求的模式

  • 不同级别的范式要求各不相同
  • 范式可以作为衡量一个关系模式好坏的标准
  • 若关系模式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 }

image.png

模式分解到2NF:不扯断函数依赖,把局部依赖关系自己划成一个模式。

3NF

定义

  • 当且仅当R属于2NF,且R的每一个非主属性 都不传递依赖于主码主属性时,R∈3NF
  • 等效理解为不允许《非主属性》到《非码》的FD?不应该是《非码》到《非主属性》的FD吗(网上查到非码属性就是非主属性)

传递依赖:若Y→XX→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 → YY !⊆ X 时X必包含候选码,则R∈BCNF

3NF:不允许非主属性到非码的FD,但允许主属性到其它 属性的FD(“X到Y的FD” = Y → X ??)

BCNF:不允许主属性、非主属性到非码的FD

人话就是,函数依赖左边必然都是码

分解到BCNF不一定能保持函数依赖

三、模式分解的算法

3.1 保持函数依赖地分解到3NF的算法

  1. 求出最小依赖集F
  2. 把F涉及的属性划到一边R,没涉及的划另一边R'
  3. 把R中属性按F左边相同的分组,把子集去掉。剩下的加上R'就是结果

image.png

image.png

3.2 无损并且保持函数依赖分解为3NF的算法

  1. 首先用算法1求出R的保持函数依赖的3NF 分解,设为q={R1,R2,…,Rk} ===> 已经得到保持依赖的3NF
  2. 设X是R的码,求出p=q ∪{R(X)}
  3. 若X是q中某个Ri的子集,则在p中去掉R(X)
  4. 得到的p就是最终结果

人话:在保持函数依赖的3NF模式中,若主码模式R(X)还没被某个模式包含,就加上去

3.3 无损分解为BCNF的算法

不用先确认模式R是不是已经符合2NF或者3NF,没有前置要求,直接一步到位从1NF变成BCNF

image.png

Released under the GNU General Public License v3.0.