2.3 码
2 .3 码
一个元组的属性值必须是能够唯一区分元组的。换句话说,一个关系中没有两个元组在所有属性上的取值都相同
超码
超码(superkey
)是一个或多个属性的集合
,这些属性的组合
可以使我们在一个关系中唯一地标识一个元组。
例如, instructor
关系的ID
属性足以将不同的教师元组区分开来,因此,ID
是一个超码。另一方面, instructor
的name
属性却不是一个超码,因为几个教师可能同名。
超码中可能包含无关紧要的属性。例如,ID
和name
的组合是关系instructor
的一个超码。如果K
是一个超码,那么K
的任意超集也是超码。
候选码
我们通常只对这样的一些超码感兴趣,它们的任意真子集都不能成为超码。这样的最小超码称为候选码(candidate key
)。
候选码不唯一
几个不同的属性集都可以做候选码的情况是存在的。假设name
和dept_name
的组合足以区分instructor
关系的各个成员,那么{ID}
和{name,dept_ name}
都是候选码。
候选码一定要是最小超码
虽然属性ID
和name
一起也能区分instructor
元组,但它们的组合{ID,name}
不是最小超码
,所以组合{ID,name}
并不能成为候选码。
主码
主码(primary key
)就是被数据库设计者选中的用来在一个关系中区分不同元组的候选码
。也就是主码是候选码中的一个
码(不论是主码、候选码或超码)是整个关系的一种性质,而不是单个元组的性质。关系中的任意两个不同的元组都不允许同时在码属性上具有相同的值。码的指定代表了被建模的事物在现实世界中的约束。
要慎重选择主码
主码的选择必须慎重。正如我们所注意到的那样,人名显然是不足以作主码的,因为可能有多个人重名。
在美国,人的社会保障号可以作候选码。而非美国居民
可能不具有社会保障号,所以跨国企业必须设置他们自己的唯一标识符。另外也可以使用另一些属性的唯一组合
作为码。
关系模式中主码的写法
习惯上把一个关系模式的主码属性列在其他属性前面
;例如,
1 | department(<u>dept_name</u>, building, budget) |
department
关系模式中的dept_name
属性最先列出,因为它是主码。主**码属性还加上了下划线
**。
外码
一个关系模式(如r1
)可能在它的属性A
中包括另一个关系模式(如r2
)的主码。这个属性A
在r1
上称作参照r2
的外码( foreign key
)。
参照关系
包含外码的关系r1
也称为外码依赖的参照关系
(referencing relation
),
被参照关系
r2
叫做外码的被参照关系
(referenced relation)
。
参照关系中外码的值和被参照关系中主键的值相同
例如, instructor
中的dept_name
属性在instructor
上是外码,它参照department
,因为dept_name
是department
的主码。
在任意的数据库实例中,从instructor
关系中任取一个元组t_a
,在department
关系中必定存在某个元组t_b
,使得t_a
在外码dept_name
属性上的取值与t_b
在主码dept_name
上的取值相同。
1 | instructor(ID,name,dept_name,salary) |
参照完整性约束
参照完整性约束要求在参照关系中任意元组在特定属性上的取值必然等于被参照关系中某个元组在特定属性上的取值。