1. 候选码和主码

超码

超码:对于关系r的一个或多个属性的集合A,如果属性集A可以唯一地标识关系r中的一个元组,则称属性集A为关系r的一个超码 (superkey) 。

候选码

设关系R有属性A1,A2,…,An,其属性集K=(Ai,Aj,…,Ak),当且仅当满足下列条件时,K被称为候选码。

  • 唯一性(Uniqueness),关系R的任意两个不同元组,其属性集K的值是不同的。
  • 最小性(Minimum),组成关系键的属性集(Ai,Aj,…,Ak)中,任一属性都不能从属性集K中删掉,否则将破坏唯一性的性质。

    “课程关系”中的课程号能唯一标识每一门课程,则属性“课程号”是课程关系的候选码 “授课关系”中,只有属性的组合“教师号+课程号”才能唯一地区分每一条授课记录,则属性集“教师号+课程号”是授课关系的候选码 “选课关系”中“学号+课程号”的组合是唯一的,同时,“学号+课程号”满足最小性,从中去掉任一属性,都无法唯一标识选课记录

主码

  • 如果一个关系中有多个候选码,可以从中选择一个作为查询、插入或删除元组的操作变量,被选用的候选码称为主码
  • 主码也称为主关系键、主键、关系键、关键字等,后续章节中,统一称为主码
    • 例如,假设在学生关系中增加了一个属性“身份证号”,则“学号”和“身份证号”都可作为学生关系的候选码。
    • 如果选定“学号”作为数据操作的依据,则“学号”为主码。
    • 如果选定“身份证号”作为数据操作的依据,则“身份证号”为主码。
    • 主码是关系模型中的一个重要概念,每个关系有且只有一个主码,选定以后,不能随意改变。

image.png

主属性和非主属性

  • 主属性(Prime Attribute)是指包含在主码中的各个属性
  • 非主属性(Non-Prime Attribute)是指不包含在任何候选码中的属性,也称为非码属性

    在最简单的情况下,一个候选码只包含一个属性,如学生关系中的“学号”,教师关系中的“教师号” 在最极端的情况下,例如,在第1章的表1-5所示的授课关系中,所有属性的组合,即“教师号+课程号”是关系的候选码,这时称为全码(All-key)。

2. 外码

如果关系R2的一个或一组属性X不是R2的主码,而是另一关系R1的主码,则该属性或属性组X称为关系R2的外码(Foreign key)或外部关系键(在后续章节中统一称为外码),并称关系R2为参照关系(Referencing Relation),关系R1为被参照关系(Referenced Relation)。
image.png

关系数据库模式

关系数据库也有型和值之分:

  • 就是关系数据库模式,即它所包含的所有关系模式的集合;
  • 就是这些关系模式在某一时刻所对应的关系的集合,通常就称为关系数据库实例

在实际应用中,人们经常把关系数据库模式关系数据库实例都笼统地称为关系数据库
image.png

3. 关系的完整性

image.png

实体完整性

  • 实体完整性是指主码的值不能为空或部分为空
    • 若属性集A是关系r的主码,则A不能取空值null。

    例如,关系Student,由于studentNo是关系Student的主码,因此它在任何时候的取值都不能为空值null。

    • 如果主码是由若干个属性的集合构成,则要求构成主码的每一个属性的值都不能取空值。

    例如,关系Score,它的主码是{studentNo, courseNo, term},因此这3个属性都不能取空值null 。

参照完整性

如果关系的外码X与关系R1的主码相符,则R2 中X的每个值或者等于R1中主码的某一个值或者取空值
image.png
image.png
image.png
image.png
image.png
image.png
image.png

用户自定义完整性

用户自定义完整性是针对某一具体关系数据库的约束条件,它反映某一具体应用所涉及的数据必须满足的语义要求。

  • 属性值根据实际需要,要具备一些约束条件。
  • 如规定选课关系中成绩属性的取值范围在0和100之间;某些数据的输入格式要有一些限制等。
  • 关系模型应该提供定义和检验这类完整性的机制,以便用统一的、系统的方法处理它们,而不要由应用程序承担这一功能。

    数据库模式导航图

    一个含有主码和外码依赖的数据库模式可以通过模式导航图来表示。
    • 数据库模式导航图一个含有主码和外码依赖的数据库模式可以通过模式导航图来表示。关系Student与Class之间存在多对一的“归属”联系(一个班由多个学生组成,一个学生只能归属于某个班),通过外码classNo实现该联系。
    • 关系Student与Course之间存在多对多的“选修”联系。 关系Score的主码是{studentNo, courseNo, term},显然同一个学生在同一个学期不允许修读同一门课程多次。
    • studentNo、courseNo都是关系Score的外码,分别实现与关系Student、Course之间的多对一联系(间接地实现了关系Student与Course之间的多对多“选修”联系)。
    • 关系Course的外码priorCourse参照本关系的主码courseNo。

image.png
image.png