今天看了数据库范式,结果盯着一篇知乎回答看了很久还是没搞明白,在讲码的时候和我看到的其它博客好像不太一样,由于讲到了函数依赖、唯一标识等这些,我就去看了函数依赖,看完再回来看结果还是发现哪里不对,所以又去看了“什么是码”,一查如一石激起千层浪,又多了超码、候选码、主码、超键、候选键、主键、主属性、非主属性等等这些概念,差点把我搞晕了
幸好脑袋思绪杂乱之时查到了几篇还不错的博客,在此也给大家分享一下,这些博客也是我参考的出处。
参考1:https://blog.csdn.net/sumaliqinghua/article/details/85872446
参考2:https://blog.csdn.net/u010191034/article/details/40477361
参考3:https://www.zhihu.com/question/24696366
引用参考1:键=码,主键=主码=主关键字,候选键=候选码=候选关键,超键=超码
所以现在我们的概念从
超码、候选码、主码、超键、候选键、主键、主属性、非主属性
变成
超码、候选码、主码、主属性、非主属性
(因为键=码)
哈哈,这就轻松多了!那开始吧!
一、概念
概念转自参考一:好好看下概念其实很好理解的
PS: 元组:可以理解为一张表中的每条记录,也就是每一行
超码:能够唯一标识一条记录的属性或属性集
- 标识性:一个数据表的所有记录都具有不同的超键
- 非空性:不能为空
候选码:能够唯一标识一条记录的最小属性集(不含多余属性)
- 标识性:一个数据表的所有记录都具有不同的候选键
- 最小性:候选键的任何子集都不能唯一标识一个记录
- 非空性:不能为空
主码:某个能够唯一标识一条记录的最小属性集(候选码中的“人选之子”)
- 唯一性:一个数据表只能有一个主键
- 标识性:一个数据表的所有记录都具有不同的主键取值
- 非空性:不能为空
超码、候选码和主码总结:
共同点:惟一标识一个元组
区别:超码中可能有无关的属性,而主码和候选码中属性都是必要的属性;
主码是候选码中的一个”人选之子“(数据库设计者所选)
主属性:包含在候选码中的属性
非主属性:不包含在候选码中的属性称为非主属性,相对于主属性来定义的。
二、举例
有关系模式R(学号、姓名、性别、课程名、期末分数),假设姓名会重复,课程名不重复,忽略表设计。
1、超码
就这个学生课程分数表来说,超模,啊呸,超码可以是什么呢?
回去看下超码的概念:能够唯一标识一条记录的属性或属性集,所以只要能唯一标识就好了是吧!
学号可以唯一标识吗?不行,虽然它不重复,但是同一个人的不同课程记录只有学号是区分不开的!一个学生对多门课程,学生→课程名不成立
姓名可以唯一标识吗?不行,因为姓名可能会重复,所以姓名→其他属性都不成立
性别可以唯一标识吗?不行,因为你在开玩笑
课程名可以唯一标识吗?不行,不解释
期末分数可以唯一标识吗?不行,不解释
PS:其实如果把课程名、期末分数换成父亲姓名,也就是换成学生专业信息表,用学号就能区分了,因为一个学生只对一个父亲,所以确定了学号就能确定其他信息
那咋办,我们想想,想区分不同学生的不同课程的成绩怎么搞?首先得有学生其次得有课程
怎么确定学生?用学号!因为一个学生对一个学号
怎么确定课程?用课程名!因为一个课程对一个课程名
所以(学号、课程名)就是一个超码,他俩合体后就能区分记录了!
那很显然,它的超集(学号、课程名、姓名)也是,(学号、课程名、性别)也是等等等,可以看出超键有很多,不过实际超码的意义不是很大,所以我们要找候选码!
2、候选码
回去看下候选码的概念:能够唯一标识一条记录的最小属性集(不含多余属性)
不含多余属性的意思是什么?就是不用你我也行!你是多余的
我们拿上面的一些超码出来 (学号、课程名) (学号、课程名、姓名) (学号、课程名、性别)
上面三个超码可以唯一标识一条记录,但是有两个是含有多余属性的:
(学号、课程名、姓名):学号、课程名就能标识记录,所以姓名这个属性就是多余属性,所以不是候选键
(学号、课程名、性别):学号、课程名就能标识记录,所以性别这个属性就是多余属性,所以不是候选键
所以只有(学号、课程名)是候选码,不过不要认为候选码只能有一个哦,这里只有一个是 这个例子确实只有一个
3、主码
回去看下主码的概念:某个能够唯一标识一条记录的最小属性集(候选码中的“人选之子”)
候选码 是 能够唯一标识一条记录的最小属性集
主码 是 某个能够唯一标识一条记录的最小属性集
多了个“某个”,而这个“某个”也是我们(数据库设计者)选出来的,因为候选码只有(学号、课程名),所以我们就选它。
那它就是 主码 了!
4、主属性与非主属性
回去看下候选码的概念:能够唯一标识一条记录的最小属性集(不含多余属性)
主属性:包含在候选码中的属性,很简单 候选码是(学号、课程名)
非主属性:不包含在候选码中的属性称为非主属性。 相对于主属性来定义的。(姓名、性别、期末成绩)
所以这些码、键啊就是为了区分记录的
三、函数依赖
引用参考3
1、函数依赖:若在一张表中,在属性(或属性组)X的值确定的情况下,必定能确定属性Y的值,那么就可以说Y函数依赖于X,写作 X → Y
2、完全函数依赖:
3、部分函数依赖:
4、传递函数依赖:
5、平凡函数依赖与非平凡函数依赖:
例子
就拿我们刚才那个表做例子
函数依赖集F={
学号→姓名
学号→性别
课程名→期末成绩
(学号、课程名)→ 姓名
(学号、课程名)→ 性别
(学号、课程名)→ 期末成绩
}
对于(学号、课程名)→ 姓名,有学号→姓名,存在非主属性 姓名 对(学号、课程名)的部分函数依赖!
对于(学号、课程名)→ 性别,有学号→性别,存在非主属性 性别 对(学号、课程名)的部分函数依赖!
对于(学号、课程名)→ 期末成绩,有课程名→期末成绩,存在非主属性 期末成绩 对(学号、课程名)的部分函数依赖!
(学号、课程名)是候选码,也是我们选的主码!它虽然能唯一标识,但是存在非主属性对其的部分函数依赖!不符合第二范式