码是最宽泛的概念,主码、候选码都属于码。
设为中的属性或属性组合,若,则为的候选码。若候选码多于一个,则选定其中的一个为主码。
(要看懂以上概念,需要掌握完全函数依赖的相关概念)
通俗的举例:
假设有一个列表,列名为大写的ABCDEF,内容小写。
假设A能推出其余所有BCDEF(能唯一区分不同元组的属性),那么A就是一个码。又或者组合(B,C)也能推出其余所有ADEF(能唯一区分不同元组的属性组合),那么这个组合(B,C)也是码。那么这个表的码有:①A; ②(B,C);③其他包含①或②的集合。
候选码就是码的基础上筛选:真子集不能是码。单个码A本身也是候选码,因为空集是任何一个非空集合的真子集,码的子集(空集)当然不能推出其他列信息。可以选择A,也可以选择(B,C),但是不能选择(A,B,C),因为这样的组合存在真子集(B,C)或者A使得这个子集能够推出其他列的信息。也不能选择单个B或者单个C,因为这样单个的B或者C都不是码。也不能选择大于A或者(B,C)的集合如(B,C,D),这样的话它的真子集(B,C)还是码,不符合完全函数依赖的要求(也就是说,候选码的真子集不能再出现码)。
A | B | C | D | E | F |
a1 | b1 | c1 | d1 | e1 | f1 |
a2 | b2 | c2 | d2 | e2 | f2 |