超键:如果一个关系(表)中所有属性(列)都由一个属性集合决定,那么这组属性集合称为超键。
显然,由一个关系的所有属性组成的属性集合必然是这个关系的超键。
通俗地讲,超键用来唯一确定一个元组(行,记录)。
候选键:一个可以用来唯一确定一个元组的极小的属性集合,即极小超键。(minimal superkey)
主键:一个关系的所有候选键中选择一个用来唯一确定关系的元组,这个候选键成为主键。
外键:在一个关系中,如果一个属性集合是另一个关系的主键,这个属性集合称为外键。
下面说说我的理解。
- 键
键(Key)的含义很重要,却往往被人忽视。数据库用来记录事实,并且提供物理独立性,用户不需要关心数据在磁盘中如何存储,只需要知道数据保存在哪个表中的哪些列里。
在设计数据库时,通常先对需要记录的事实进行数据建模,抽象出实体,关系。每个实体总要有个方法去识别它,不然你就无法从数据库中查询你想要的数据。键(Key)就是用来识别实体的。换句话说,键可以用来确定表中具体的一行记录。
举个简单的例子,假设有一个表Person(FirstName, LastName, BirthTime, Gender),这张表用来记录关于人的数据(姓名,出生时间,性别)。
在日常生活中,我们用姓名来标识一个人。但有时候不同的人叫相同的名字,这时单纯用姓名就无法唯一确定一个人了。我们往往通过附加其他信息来确定这个人,比如出生时间,父母,城市,等等。
- 超键
一组属性(或列)(A1, A2, …, An) 可以成为某个实体E的 super key, 如果通过这些属性可以确定一个实体。
如果同样的姓名和出生时间可以标识一个人,那么(FirstName, LastName, BirthTime)就是Person的一个超键。
当然,(FirstName, LastName, BirthTime)加上Gender,即 (FirstName, LastName, BirthTime, Gender)也是一个super key。
但(FirstName, LastName)不是super key,因为有同名同姓的人。如果没有同名同姓的人,那(FirstName, LastName)也是super key。
- 候选键
从super key 中去掉一些属性,剩下的属性有可能是super key,也有可能不是。
如果从一个super key中的属性中,去掉任何一个属性,都不能唯一确定一个实体,那么这个super key就是candidate key。
要描述一个人,我们不需要把所有关于这个人的信息都说出来,那样没有必要。我们也不能只说这个人姓什么,因为这样还不够,听的人不知道是谁。
所以,我们要做的是,用最少的事实描述一个人。这就是 candidate key存在的意义。
- 主键
描述一个东西可以用不同的属性组合.。一个人可以用姓名+出生时间指定,也可以用身份证号码(假设每个人都有身份证号)。因此,一个实体的candidate key也可能有多个。 那我们用哪个来描述一个实体呢?
都可以,所以叫 candidate (候选的) key。当然,候选也意味着有些被选上,有些被淘汰。在数据库中,有一种方法描述实体就够了,因此,要从候选键中选一个作为主键(Primary Key)。
有了主键,就可以用它描述实体。
- 外键
每个表都应该有一个主键,用来唯一确定一行数据。
数据库中,不同的东西保存在不同的表中,有些表之间是互相关联的。假设有个表用来保存公司的员工,一个员工同时也是一个人,这个人的基本信息保存在另一个表Person中,这就需要引用别的实体。
前面说过,主键就是起这个作用的,可以用来标识一个实体。当一个表的主键被一个表引用,它在那个表中就成为外键(foreign key)。
注意:
上面所举的例子只是起说明概念的作用,实际上人的主键不好确定。
a) 也许有两个人同名同姓同时出生,怎么办?
b) 即使没有同名同姓同时出生的人,用许多属性(甚至所有的关于一个实体的属性)来用描述一个人,很不经济。
c) 有些人没有身份证。
一个解决办法是,给每个人一个唯一的数值或名字,专门用来标识一个人,就像学生的学号。这样生成的键角人工键,替代键, 等等(artificial key, surrogate key).
有些人在设计数据库时,每个表都用surrogate,以防万一。实际上这是错误的,愚蠢的。原因有很多,很明显的原因是:他们不是真正意义上的主键。它们没有实际意义,用它们无法标识实体,无法避免重复,只能用过数据库之外的方法(如应用程序)来避免重复)。
若想了解关系代数,可以参照这篇博客:https://blog.csdn.net/zsi386/article/details/79091307