关于数据库键(Key)的一些理解

超键:如果一个关系(表)中所有属性(列)都由一个属性集合决定,那么这组属性集合称为超键。
显然,由一个关系的所有属性组成的属性集合必然是这个关系的超键。
通俗地讲,超键用来唯一确定一个元组(行,记录)。

候选键:一个可以用来唯一确定一个元组的极小的属性集合,即极小超键。(minimal superkey)

主键:一个关系的所有候选键中选择一个用来唯一确定关系的元组,这个候选键成为主键。

外键:在一个关系中,如果一个属性集合是另一个关系的主键,这个属性集合称为外键。


下面说说我的理解。

键(Key)的含义很重要,却往往被人忽视。数据库用来记录事实,并且提供物理独立性,用户不需要关心数据在磁盘中如何存储,只需要知道数据保存在哪个表中的哪些列里。
在设计数据库时,通常先对需要记录的事实进行数据建模,抽象出实体,关系。每个实体总要有个方法去识别它,不然你就无法从数据库中查询你想要的数据。键(Key)就是用来识别实体的。换句话说,键可以用来确定表中具体的一行记录。

举个简单的例子,假设有一个表Person(FirstName, LastName, BirthTime, Gender),这张表用来记录关于人的数据(姓名,出生时间,性别)。
在日常生活中,我们用姓名来标识一个人。但有时候不同的人叫相同的名字,这时单纯用姓名就无法唯一确定一个人了。我们往往通过附加其他信息来确定这个人,比如出生时间,父母,城市,等等。

  1. 超键

一组属性(或列)(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。

  1. 候选键

从super key 中去掉一些属性,剩下的属性有可能是super key,也有可能不是。

如果从一个super key中的属性中,去掉任何一个属性,都不能唯一确定一个实体,那么这个super key就是candidate key。
要描述一个人,我们不需要把所有关于这个人的信息都说出来,那样没有必要。我们也不能只说这个人姓什么,因为这样还不够,听的人不知道是谁。
所以,我们要做的是,用最少的事实描述一个人。这就是 candidate key存在的意义。

  1. 主键

描述一个东西可以用不同的属性组合.。一个人可以用姓名+出生时间指定,也可以用身份证号码(假设每个人都有身份证号)。因此,一个实体的candidate key也可能有多个。 那我们用哪个来描述一个实体呢?
都可以,所以叫 candidate (候选的) key。当然,候选也意味着有些被选上,有些被淘汰。在数据库中,有一种方法描述实体就够了,因此,要从候选键中选一个作为主键(Primary Key)。
有了主键,就可以用它描述实体。

  1. 外键

每个表都应该有一个主键,用来唯一确定一行数据。
数据库中,不同的东西保存在不同的表中,有些表之间是互相关联的。假设有个表用来保存公司的员工,一个员工同时也是一个人,这个人的基本信息保存在另一个表Person中,这就需要引用别的实体。
前面说过,主键就是起这个作用的,可以用来标识一个实体。当一个表的主键被一个表引用,它在那个表中就成为外键(foreign key)。

注意
上面所举的例子只是起说明概念的作用,实际上人的主键不好确定。
a) 也许有两个人同名同姓同时出生,怎么办?
b) 即使没有同名同姓同时出生的人,用许多属性(甚至所有的关于一个实体的属性)来用描述一个人,很不经济。
c) 有些人没有身份证。
一个解决办法是,给每个人一个唯一的数值或名字,专门用来标识一个人,就像学生的学号。这样生成的键角人工键,替代键, 等等(artificial key, surrogate key).

有些人在设计数据库时,每个表都用surrogate,以防万一。实际上这是错误的,愚蠢的。原因有很多,很明显的原因是:他们不是真正意义上的主键。它们没有实际意义,用它们无法标识实体,无法避免重复,只能用过数据库之外的方法(如应用程序)来避免重复)。

若想了解关系代数,可以参照这篇博客:https://blog.csdn.net/zsi386/article/details/79091307

  • 23
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值