数据库原理与应用 第 2 章 · 第四节
课程第 2 章第四节 过渡候选码超码主码主属性外码公民表与学生表
第 2 章 关系数据库 · 第四节

候选码、主码与外码

靠什么认出一行,表与表之间靠什么连起来
本 节 知 识 点
  1. 282.3 关系的码和关系的完整性
  2. 29候选码
  3. 30候选码的例子与超码
  4. 31主码
  5. 32主属性和非主属性
  6. 33外码
  7. 34外码的例子:公民表与学生表
28
第 2 章 · 第四节

2.3 关系的码和关系的完整性

这一节回答两个问题:靠什么认出表里的一行,表与表之间靠什么连起来。

第 28 页课件

重 点这一块看的时候抓三点

候选码要同时满足唯一性和最小性,第 30 页有一个可以动手试的判断器。主码是从候选码里挑出来日常用的那一个,每个关系只有一个。外码是别的表的主码放到我这张表里,表和表就靠它连起来。下一节的三类完整性,前两类正好盯着主码和外码。

想一想

在一张没有学号的学生表里,你打算靠什么认人?

29
第 2 章 · 第四节

候选码

候选码是能唯一区分元组、且去掉任何一个属性就不再唯一的属性集,唯一性和最小性缺一不可。

第 29 页课件

关键术语

候选码Candidate Key
同时满足唯一性和最小性的属性集,一个关系可以有多个。

重 点定义 2.6 的两个条件

唯一性说任何两行在这组属性上的值都不同。最小性说这组属性一个都不能少,少一个就不再唯一。课件的三个例子:课程号一个属性就够了。授课关系要教师号加课程号,一位教师可以教多门课,一门课也可以由多位教师教。选课关系的学号加课程号,去掉哪一个都会重复。

打个比方

一把能开门的钥匙是唯一性。钥匙串上再多挂一把没用的,门照样能开,但这串钥匙就不是最小的了。

想一想

“姓名加性别”能不能做学生表的候选码?

30
第 2 章 · 第四节

候选码的例子与超码

学号是候选码,身份证号也是候选码,学号加姓名虽然唯一但不最小,叫超码。

第 30 页课件

关键术语

超码Superkey
满足唯一性但不一定满足最小性的属性集,候选码是最小的超码。

重 点判断的三步

先看唯一,再看最小,两条都满足的是候选码,只满足唯一的是超码,连唯一都不满足的就不是码。例子 B 的三列合起来才唯一,去掉任何一列都会出现重复,所以三列一起是候选码,它只有这一个候选码。

试一试勾几个属性,检查它是不是码

Student 的样本数据,勾选属性后按检查
studentIdidCardnamephone
S001110101张三138001
S002110102李四138002
S003110103张三138003
S004110104王五138002
勾一个或几个属性组成属性集 K,检查它满不满足唯一性和最小性。

想一想

身份证号加学号是候选码还是超码?

31
第 2 章 · 第四节

主码

候选码可能有几个,主码只能有一个,从候选码里挑一个日常使用,其余的用 UNIQUE 保留。

第 31 页课件

关键术语

主码Primary Key
被选中作为查询、插入、删除操作变量的那个候选码,也叫主键。

重 点怎么挑

课件下半页的四条原则:稳定,不随业务变化,学号比手机号稳。短小,单列优先于多列,存储和索引都省。不含空值,空值认不出任何一行。便于被别的表引用,常被外键引用的列要好用。例子 A 挑学号不挑身份证号,学号短而且不涉及隐私,身份证号加 UNIQUE 约束保留唯一性。例子 B 只有一个候选码,它就是主码。规则一句话:每个关系有且只有一个主码。

练一练

每个关系最多可以有几个主码?
  1. A一个
  2. B两个
  3. C任意多个
  4. D和候选码一样多
答案 A

候选码可以有多个,主码只能从中选一个。其余候选码的唯一性可以用 UNIQUE 约束保留,但它们不叫主码。

想一想

手机号为什么不适合做主码?

32
第 2 章 · 第四节

主属性和非主属性

出现在候选码里的属性是主属性,任何一个候选码都不沾的属性是非主属性。

第 32 页课件

关键术语

主属性Prime Attribute
包含在候选码里的属性,主码里的属性一定是主属性。
非主属性Non-Prime Attribute
不包含在任何候选码里的属性,也叫非码属性。

重 点看候选码还是看主码

教材原文说主属性是包含在主码中的属性,课件下半页说是出现在任一候选码中的属性。只有一个候选码时两种说法一样。有多个候选码时按候选码算更常用,例子 A 里身份证号没被选为主码,但它是候选码,所以算主属性。例子 B 三个属性都是主属性,grade 是非主属性。这个区分第 12 章判断部分依赖和传递依赖时会用到。

想一想

教师关系里,姓名是主属性还是非主属性?

33
第 2 章 · 第四节

外码

外码是在本关系里不是主码、却是另一个关系主码的属性,本关系叫参照关系,被指向的叫被参照关系。

第 33 页课件

关键术语

外码Foreign Key
本关系里引用另一个关系主码的属性或属性组,也叫外键。
参照关系Referencing Relation
含有外码的那个关系,图上是 R2。
被参照关系Referenced Relation
外码所指向的那个关系,图上是 R1。

重 点读图

属性 X 在 R1 里是主码,在 R2 里是外码,箭头从 R2 指向 R1。底部那句话很重要:两边必须定义在同一个域上,学号在学生表和选课表里必须是同一种类型。选课(学号,课程号,成绩) 里学号是外码,参照学生表,课程号也是外码,参照课程表。

打个比方

快递单上的收件人手机号:在你的通讯录里它是认人的主码,在快递单上它是指向你的外码。快递单不需要抄一遍你的全部信息,有这个号码就能找到你。

想一想

授课(教师号,课程号) 里有几个外码?

34
第 2 章 · 第四节

外码的例子:公民表与学生表

学生表里的身份证号引用公民表的主码,所以它是学生表的外码,没有外码约束就会出现查无此人的记录。

第 34 页课件

重 点两个要点

身份证号在公民表里是主码,在学生表里是外码而不是主码,学生表的主码是学号。外码约束的作用是拒绝 999999 这种公民表里根本没有的值,课件的原话是“数据就乱了”。这一条到第五节就叫参照完整性。

打个比方

宿舍住宿登记表上写的房间号必须是楼里真有的房间,写一个不存在的 999 室,登记就该被退回。楼里的房间表是被参照关系,登记表是参照关系。

想一想

学生表里的“姓名”也出现在公民表里,它是外码吗?

保山学院·人工智能教研室·曹鼎鼎