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

 

一、概念

二、举例

1、超码

2、候选码

3、主码

4、主属性与非主属性

三、函数依赖

例子


 

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

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

    参考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={

      学号→姓名

      学号→性别

      课程名→期末成绩

    (学号、课程名)→ 姓名

    (学号、课程名)→ 性别

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

}

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

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

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

 

 

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

 

 

 

 

 

 

  • 103
    点赞
  • 255
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
1. 函数依赖:在关系模型中,如果一个或多个属性的值可以唯一地确定其他属性的值,则称这些属性之间存在函数依赖关系。 2. 部分函数依赖:在关系模型中,如果一个关系中的某个属性依赖于关系中的部分属性,而不依赖于所有属性,则称这种依赖关系为部分函数依赖。 3. 完全函数依赖:在关系模型中,如果一个关系中的某个属性依赖于关系中的所有属性,而不依赖于任何一个属性的真子集,则称这种依赖关系为完全函数依赖。 4. 传递依赖:在关系模型中,如果存在A->B和B->C两个函数依赖,那么就存在一个传递依赖A->C。 5. 候选码:在关系模型中,如果一个属性集合能够唯一确定一个元组,则称这个属性集合为候选码。 6. 超码:在关系模型中,如果一个属性集合能够唯一确定多个元组,则称这个属性集合为超码。 7. 主码:在关系模型中,唯一标识一个关系中元组的属性或属性集合称为主码。 8. 外码:在关系模型中,如果一个关系中的某个属性或属性集合是另一个关系的主码,则这个属性或属性集合称为外码。 9. 全码:在关系模型中,如果一个属性集合包含了关系中所有属性,则称这个属性集合为全码。 10. 1NF:第一范式,所有属性都是原子的,不可再分。 11. 2NF:第二范式,满足1NF的基础上,非主属性完全依赖于候选码。 12. 3NF:第三范式,满足2NF的基础上,不存在传递依赖。 13. BDNF:巴斯-戴卡规范化范式,是在3NF的基础上,对非主属性之间的依赖进行分解的范式

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值