1. 我们通过元组里各个属性的值来区分一个关系中的各个元组——在一个关系中,一个元组的属性值必须能唯一区分这个元组或者说,在一个关系里,任意两个元组的属性值不能完全相同。
2. 超键(Superkey),由一或多个属性组成,能唯一区分一个关系里的各个元组。Instructor关系里的ID是一个超键,NAME不是。
3. 用R表示关系r的方案中的属性集合。如果R的子集K是r的一个超键,则我们要求在r的实例中任意两个元组属于K的那一部分属性不能完全相同。也就是说,如果t1、t2是r中的两个元组,且t1 != t2,则t1.K != t2.K
4. 超键中可能包含无用的信息。ID 和Name也是关系instructor的一个超键。如果K是一个超键,则K的任何超集都是超键。我们比较关心的是那些其全部子集都不能作超键的超键。——也就是那些没有任何多余东西的超键——我们称这些超键为备选键Candidate Keys.
5. 一个关系可能有多个备选键。如果我们假设instructor关系中name和dept_name能唯一区分一位老师,则{ID } 和{name, dept name }便都是备选键。
6. 主键(PrimaryKey)是被数据库设计师选中的,用来区分一个关系里的各个元组的那个备选键。
7. 超键》备选键》主键。
8. 主键的挑选要十分慎重。首先是不要挑那些可能重复的属性比如姓名,或者是可能为null的属性,比如(社保号,某些国家的居民可能没有社保号)
9. 其次主键的值应当固定不变或者基本不变。一个人的住址就不适合当主键。
10. 习惯上,列出一个关系方案中的全部属性时,我们会把主键属性放前面,并且加上下划线。
11. 关系r1的属性中可能包含关系r2的主键。称这个属性为从r1引用r2的外键。R1 是外键依赖中的引用关系(referencing relation of the foreign key dependency)R2是外键依赖中的被引用关系(referenced relation of the foreign key)。
12. 比如instructor中的dept_name 是从instructor引用dept_name的外键。在任意一个数据库实例中,对instructor中的任一元组ta,在department关系中都必然存在另一个元组tb,满足ta中的dept_name值与tb的主键dept_name的值相同。
13. 再来看Section 和Teaches这两个关系。每门课程至少要有一个老师,因此对section 中的任意一组(course id, sec id,semester, year)值都会出现在 teaches关系中。但是这个属性集并不是teaches关系的主键,因为存在多个老师教同一门课的情况。因此我们无法声明从section到teaches的外键约束,但可以声明从teaches到section的外键约束。
14. 从Section到Teaches的约束(section 中的任意一组(course id, sec id,semester, year)值都会出现在 teaches关系中)是一个引用完整性约束——在引用关系的某一组属性中出现的值在被引用关系的某一组属性中至少出现一次。