候选码
系列 - mysql数据库
目录
如何选出候选码?
- 只出现在左边的一定是候选码
- 只出现在右边的一定不是候选码
- 左右都出现的不一定
- 左右都不出现的一定是候选码
- 再求确定的候选码的闭包,如果可以推出全部,那么当前确定的就是候选码,否则你要吧每一个可能的值放进当前确定的候选码里面进行求闭包
比如 R<U, F> , U (A, B, C, D, E, G), F={AB–>C, CD–>E, E–>A, A–>G) 求候选码:
B 一定是候选码 D 一定是候选码 G 一定不是候选码 A 不一定 C 不一定 E 不一定
BD->啥也推不出来, 所以要把每一个可能的求闭包 (BDA)+= 可推出 CEAG 所以可以推出 ABCDEG (BDC)+=可推出 E A G 所以可以推出 ABCDEG (BDE)+= A G C 可以推出 ABCDEG 那么他的候选码最终是{(BDA), (BDC), (BDE)};
超码:能表示出所有属性的集合,比如(BDA),(BDC), (BDE) BDCABDEA ABCDE 候选码 是最小的超码。
主码:从候选码里面任意跳出一个作为主码
主属性:包含在所有候选码的属性比如 ABCDE
非主属性:不包含在候选码中的属性 , 上题为 G
全码:所有的属性都是主码
什么是依赖 ?
依赖是指关系中一个或一组属性的值可以决定其它属性的值 比如 A->B 这就是一个依赖
如何求最小依赖集?
- 拆右边为多个元素的的比如 A->BC 拆为 A->B 和 A->C
- 除去当前元素,求它的闭包,把集合里面所有元素都弄完,若不能推出,则保留
- 左边最小化 (通过遮住元素来看能不能推出其他元素) 比如 BCD, 遮住 B 看能退出 CD 吗,遮住 C 能退出 BD 吗遮住 D 看能退出 BC 吗
模式分解
模式分解即是将一个冗余较大操作比较繁琐的关系模式拆解为几个等价的关系模式。 准则:无损连接和保持函数依赖
- 无损:就是分解后再次连接, 和分解之前一样
- 依赖:依赖不变
已知 R (ABCDEGH), F={A->D, E->D, D->B, BC->D, DC->A} , 求保持函数依赖的 3NF 的分解
- 求出最小函数依赖集
- 把不在 F 里面的属性都找出来,单独分一类,并去除
- 把每一个依赖左边相同的分成一类,没有一样的,那么就把 A->D 改为 {AD},, 如果一样{A->B,A->C 那么就改为{ABC}
- 如果候选码没出现在分离里面,把任意一个候选码作为一类
最小函数依赖集 Fmin={A->D, E->D, D->B, BC->D, DC->A}
GH 没在 F 里面,单独一类 [GH]
候选码:CE
{AD}{EH}{DH}{DB}{BCD}{DCA}{CE}{GH}