1. ER图
每个实体集里面都有至少一个关键属性(可能是多个属性组成的集合),在此属性下每个实体各不相同。
键是一组最小的属性集合,它们的值能够唯一地确定实体集中的每个实体。
候选键:可以作为key属性的最简形态(缺一不可)可以存在多个候选键
主键:候选键中选出一个最主要的key属性 ,用来唯一确定实体
超码:所有能成为key属性的属性及其集合
(可以有冗余属性,可能删掉其中一两个属性还是能成为关键属性)
外键:另外一个实体集的主键,用来建立两个表格之间关系的约束。这种关系一般都涉及一个表格里的主键字段,与另外一个表格里相连的字段。这些相连的字段就是外键。
超码 > 候选键> 主键
超码唯一标识实体,候选码为超码的最简形态(缺一个就不可以唯一标识实体)
弱实体集:一个实体对于另一个实体(一般为强实体,也可以是依赖于其他强实体的弱实体)具有很强的依赖联系,而且该实体主键的一部分或全部从其强实体(或者对应的弱实体依赖的强实体)中获得,则称该实体为弱实体。
强实体集的Key都是弱实体集的外键。
弱实体集和强实体集之间的支撑联系必须是多对唯一的。
如果实体集E对F 是一对一(或多),且E的属性互斥,就可以删除E,把E的属性加入F
2. 关系模型
弱实体集转换为表格:对应强实体集的关键字和弱实体集的关键字组合成表格关键字
弱实体集里的属性即为表格中属性
联系转为表格:
①多对多:双方的主键为主键
②多对一:多的主键为主键(唯一时还要限定其非空,以一的主键为外键)
③多路联系:联系里的属性即为关联的表格的主键
弱实体集和对应唯一确定的强实体集间的弱联系不需要变成表格,加上此弱实体集对应唯一确定的强实体集的关键字。
例如:A是弱实体集,B是对应唯一确定的实体集,R是联系
变成表格时实体集B一张表,弱实体集A和B的主键一张表,一共两张表。
如果A、B都不是弱实体集,那么就是A、B、R三张表。
④一对一:其中一方的主键
合并有相同关键字的表格。多对多的一般不合并,否则表格中可能出现重复冗余。
3. 函数依赖
属性A函数决定属性B(A->B):对于任意两行,如果A相同,则对应的B也相同
(就是说一个自变量只能对应一个因变量,候选码可以函数决定其余所有属性!)
判断A->B:只取A和B的列观察,如果A相同,B也要相同
组合FD:
传递性(A-> B, B -> C 可推出 A -> C)
结合性(A-> {B1, B2} 可推出 A -> B1 && A -> B2)
自反性(A可以函数决定其本身和它的子集)
增广率(A -> B 可推出 {A, C} -> {B, C})
平凡(trivial):B为A的子集
非平凡(nontrivial):B中有属性不为A的子集
完全非平凡:B中全部属性均不为A的子集
找出最小函数依赖:增广去除,尽量完全非平凡
闭包:A的闭包(记为A+)为A所有可以决定的属性的集合
判断属性闭包的方法:
反复将A可以决定的属性放进A集合里面直至A集合不变,此时的A集合即为A的闭包
如果一个集合A的闭包(A+)为所有属性的集合,那么集合A就是超码(关键字)
如果一个集合A的闭包(A+)为所有属性的最小集合,那么集合A就是候选码
4. BCNF, 3NF
分解法:将表格中可由某些子属性所决定的属性拆出来成为新表
投影法(将子属性拆分)+ 去重
要求:属性不丢失,两张表要有公共属性, 分解后两张表的公共属性要是关键字
检查:分解后通过连接操作如果可以还原回原表格,即可说明分解有效
无损分解:只需要分解后有一个表,左边的属性能函数决定右边。
在函数依赖中,如果某个属性没有在右边出现过,那么它一定是主键的一部分。
范式
1NF:所有属性原子性
2NF:除主键外其他属性只依赖于主键的整体,不能只依赖于主键的一部分。
BCNF:如果A-> B是非平凡(nontrivial)的函数决定,那么A就是关键字(super key)
(左边只能是superkey。左边一定可以决定其它所有属性)
问题:BC范式可能导致函数决定的丢失(即使得原本有效的函数决定无效化)
3NF:对所有非平凡的A->B,A是关键字(super key)或者B是候选键的一部分.
(注意:整个B是候选键的一部分,而不是B的一部分)
问题:可能存在一定的重复项
判断BCNF:1.X->A且A属于X,即这是个平凡函数依赖。或2.X->A且X是超键。
判断3NF:1.X->A且A属于X,即这是个平凡函数依赖。
2.X->A且X是超键(Super key)。 3.A是某候选键的一部分。
BCNF分解:将左边变成超码,一直分解到符合(分解结果可能不唯一)一张表只包含违反规则的属性,让左边变成超码,另一张表包含了该超码和其它所有属性。
3NF分解算法:找最小函数决定覆盖,将最小函数决定覆盖里的每一条规则分别对应一张表格,找到其中是否存在一张表格完整包含了原表格所有的候选键,否则需要另外一张表格包含原表格所有的候选键
(注意需要一张表包含所有候选键,其它表如果可以的话就可以合并)
最小函数决定覆盖
第一步:先将右边都化为单一元素,用A -> B1和A -> B2表示A -> {B1, B2}
第二步:去除左边的冗余属性,看是否有函数依赖左边的属性可以去掉当A1 -> B或A2 -> B时用A1 -> B或A2 -> B表示{A1,A2} -> B(比如A+= AC,那么AB –> C左边就可以去掉B)
第三步:去掉所有的冗余依赖关系,看是否可以去掉某个函数依赖先去除某个依赖关系X -> Y,然后在剩余依赖关系中求X的闭包X+,若Y在X+里面则说明依赖关系X -> Y冗余,需要删除