【数据库】搞懂 超码、候选码、主码、函数依赖!

 

一、概念

二、举例

1、超码

2、候选码

3、主码

4、主属性与非主属性

三、函数依赖

例子


 

今天看了数据库范式,结果盯着一篇知乎回答看了很久还是没搞明白,在讲码的时候和我看到的其它博客好像不太一样,由于讲到了函数依赖、唯一标识等这些,我就去看了函数依赖,看完再回来看结果还是发现哪里不对,所以又去看了“什么是码”,一查如一石激起千层浪,又多了超码、候选码、主码、超键、候选键、主键、主属性、非主属性等等这些概念,差点把我搞晕了

【数据库】搞懂 超码、候选码、主码、函数依赖!_第1张图片

   幸好脑袋思绪杂乱之时查到了几篇还不错的博客,在此也给大家分享一下,这些博客也是我参考的出处。

    参考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张图片

所以(学号、课程名)就是一个超码,他俩合体后就能区分记录了!

那很显然,它的超集(学号、课程名、姓名)也是,(学号、课程名、性别)也是等等等,可以看出超键有很多,不过实际超码的意义不是很大,所以我们要找候选码!

 

2、候选码

回去看下候选码的概念:能够唯一标识一条记录的最小属性集(不含多余属性)

不含多余属性的意思是什么?就是不用你我也行!你是多余的

我们拿上面的一些超码出来  (学号、课程名) (学号、课程名、姓名) (学号、课程名、性别)

上面三个超码可以唯一标识一条记录,但是有两个是含有多余属性的:

(学号、课程名、姓名):学号、课程名就能标识记录,所以姓名这个属性就是多余属性,所以不是候选键

(学号、课程名、性别):学号、课程名就能标识记录,所以性别这个属性就是多余属性,所以不是候选键

所以只有(学号、课程名)是候选码,不过不要认为候选码只能有一个哦,这里只有一个是 这个例子确实只有一个

 

3、主码

回去看下主码的概念:某个能够唯一标识一条记录的最小属性集(候选码中的“人选之子”

候选码 是 能够唯一标识一条记录的最小属性集

主码     是 某个能够唯一标识一条记录的最小属性集

多了个“某个”,而这个“某个”也是我们(数据库设计者)选出来的,因为候选码只有(学号、课程名),所以我们就选它。

那它就是 主码 了!

 

4、主属性与非主属性

回去看下候选码的概念:能够唯一标识一条记录的最小属性集(不含多余属性)

主属性:包含在候选码中的属性,很简单 候选码是(学号、课程名)

非主属性:不包含在候选码中的属性称为非主属性。 相对于主属性来定义的。(姓名、性别、期末成绩)

 

所以这些码、键啊就是为了区分记录的

 

三、函数依赖

引用参考3

1、函数依赖:若在一张表中,在属性(或属性组)X的值确定的情况下,必定能确定属性Y的值,那么就可以说Y函数依赖于X,写作 X → Y

2、完全函数依赖:

 

    【数据库】搞懂 超码、候选码、主码、函数依赖!_第3张图片

3、部分函数依赖:

   【数据库】搞懂 超码、候选码、主码、函数依赖!_第4张图片

4、传递函数依赖:

   

5、平凡函数依赖与非平凡函数依赖:

    【数据库】搞懂 超码、候选码、主码、函数依赖!_第5张图片

例子

就拿我们刚才那个表做例子

【数据库】搞懂 超码、候选码、主码、函数依赖!_第6张图片

函数依赖集F={

      学号→姓名

      学号→性别

      课程名→期末成绩

    (学号、课程名)→ 姓名

    (学号、课程名)→ 性别

    (学号、课程名)→ 期末成绩

}

对于(学号、课程名)→ 姓名,有学号→姓名,存在非主属性 姓名 对(学号、课程名)的部分函数依赖!

对于(学号、课程名)→ 性别,有学号→性别,存在非主属性 性别 对(学号、课程名)的部分函数依赖!

对于(学号、课程名)→ 期末成绩,有课程名→期末成绩,存在非主属性 期末成绩 对(学号、课程名)的部分函数依赖!

 

 

(学号、课程名)是候选码,也是我们选的主码!它虽然能唯一标识,但是存在非主属性对其的部分函数依赖!不符合第二范式

 

 

 

 

 

 

你可能感兴趣的:(【数据分析】Sql学习)