关系数据模型 关系的等价表示法
改变列次序,不改变关系的含义。 改变行次序,不改变关系的含义。
从E/R图到关系设计 实体集到关系的转换 E/R联系到关系的转换 处理弱实体集 函数依赖
函数依赖是如何定义的?
若关系R的任意两个元组在属性A1、A2、…、An上一致(即有相同分量值),则这两个元组在属性B上也一致,则称属性A1A2…An函数决定B,或称B函数依赖于A1A2…An。 判断函数依赖的三种情形
如果任意两元组在属性A上一致,在B上也一致,则有A → B成立。 如果任意两元组在属性A上一致,在B上不一致,则A → B不成立。
如果任意两元组在属性A上不可能一致,则不管在B上是否一致,有A → B成立。 关系的键
如何用函数依赖定义键key?
定义:对于关系R,若属性集合{A1,A2,…,An}满足下列条件,则该属性集合是R的一个键key: 1.A1,A2,…,An函数决定R中所有其他属性。(超键)
2.{A1,A2,…,An}的任何真子集都不能函数决定R中所有其他属性。(最小化) 超键
什么是超键super key?
键的超集superset of key。即包含键的属性集合。 可函数决定关系中所有属性的属性集合。
每个键都是超键。
13
一个关系的属性全集超键。 每个超键都是键吗?不是。 函数依赖规则
有哪些重要的函数依赖规则? 分解/合并(Splitting/combining)规则 平凡依赖(Trivial Dependance)规则 传递(Transitivy)规则 计算属性的闭包 如何计算属性的闭包?
给定函数依赖集S和属性集A={A1,A2,…An},如何计算A+? 1 将X初始化为{A1,A2,…,An},闭包最小集合。
2 遍历S中的每个函数依赖,对于每个依赖式:B1B2…Bm → C
如果B1、B2、…、Bm都在X中,而C不在X中,则把C加入X中。
3 重复第2步,直到遍历完S中所有函数依赖,而没有新属性能加入到X中。 4 最终属性集X即为属性集A在函数依赖集S下的闭包A+。
例3.28:P90 设有关系R(A, B, C, D, E, F)与函数依赖集
S:{AB → C,BC → AD,D → E,CF → B}
求:{A,B}+
解:X(1)={A,B}, 由AB → C,得:
X(2)={A,B,C}, 由BC → AD,得:
X(3)={A,B,C,D}, 由D → E,得: X(4)={A,B,C,D,E}={A,B}+ 属性闭包计算有何用途?
假设关系R上已有一个依赖集S,另有一个函数依赖A1A2…An → B,该依赖是否蕴含于S?判断方法:
计算{A1,A2,…,An}+。
14
若B在{A1,A2,…An}+中,则函数依赖A1A2…An → B蕴含于S中。 若B不在{A1,A2,…An}+中,则函数依赖A1A2…An → B不蕴含于S中。 属性的闭包和键之间有何关系?
对于一个关系R,当且仅当A1,A2,…,An是R的超键时,{A1,A2,…,An}+是R的所有属性的集合。 3.6.1 已知关系模式R(A, B, C, D)有函数依赖AB → C, C → D, D → A (a)求蕴含于给定函数依赖的所有完全非平凡函数依赖。 (b)求R的所有键。
(c)求R的所有超键(不包括键)。 解:
(a)根据所有属性集合的闭包,计算所有可能的函数依赖。 {A}+={A} {B}+={B} {C}+={C, D, A}
C → AD
{D}+={D, A}
{A, B}+={A, B, C, D} AB → CD {A, C}+={A, C, D} AC → D
{A, D}+={A, D} {B, C}+={B, C, D, A} BC → AD {B, D}+={B, D, A, C} BD → AC {C, D}+={C, D, A}
CD → A {A, B, C}+={A, B, C, D} ABC → D {A, B, D}+={A, B, D, C}
ABD → C {A, C, D}+={A, C, D} {B, C, D}+={B, C, D, A}
BCD → A
(b)所有的键:{A, B}, {B, C}, {B, D}
(c)所有的超键(不包括键):{A,B,C}, {A,B,D}, {B,C,D}, {A,B,C,D}
15
关系数据库模式设计 BC范式
若关系模式R的每个分量均是不可再分的数据项,则R满足第一范式,又记作:R ∈ 1NF。 BC范式如何定义?
关系模式R满足BC范式,当且仅当若非平凡函数依赖A1A2…An → B1B2…Bm在关系R中成立,则{A1,A2,…,An}是R的超键。 关系R满足BC范式的两种情形
关系R中不存在非平凡函数依赖。(只有平凡函数依赖) 每个非平凡函数依赖的左面包含某个键(即左面是超键)。 关系R违背BC范式的唯一情形
关系R中至少存在一个非平凡函数依赖,其左面不是超键。 分解为BC范式
分解策略:消除违背BCNF的函数依赖
1 找一个违背BCNF的非平凡函数依赖A1A2…An → B1B2…Bm。 2 把关系R分解成两个关系:
R1(A1,A2,…,An, B1,B2,…,Bm)。
R2(A1,A2,…,An, 所有其它属性),若不满足BC范式,则再分解。
例如:R(学号, 课号, 成绩, 系号, 系主任) 不满足BCNF。 1 非平凡函数依赖:学号 → 系号,系主任 成立 2 R分解为:R1(学号, 系号, 系主任)
R2(学号, 课号, 成绩)
3 非平凡函数依赖:系号 → 系主任 成立 4 R1继续分解为:R11(系号, 系主任)
R12(学号, 系号)
第三范式
关系模式R满足3NF,当且仅当若非平凡函数依赖A1A2…An → B在关系R中成立,则
16