数据库的三大范式

范式定义会使用主键和候选键(因为主键和候选键可以唯一标识元组)

  • 能唯一标识元组的属性集叫做超键(身份识别的集合)

  • 候选键:如果超键不包括多余的属性,那么这个超键就是候选键

  • 主键:用户可以从候选键中选择一个作为主键

  • 外键:如果数据表 R1 中的某属性集不是 R1 的主键,而是另一个数据表 R2 的主键,那么这个属性集就是数据表 R1 的外键

  • 主属性:包含在任一候选键中的属性称为主属性

  • 非主属性:与主属性相对,指的是不包含在任何一个候选键中的属性

  • 1NF(第一范式)
    1NF指的是数据库表中的任何属性都是原子性的,不可再分。

  • 2NF
    2NF指的是数据表里的非主属性都要和这个数据表的候选键(属性的集合,可能是一个也可能是两个)有完全依赖关系。不仅仅是依赖候选键的一部分属性,而必须依赖全部属性。
    例子:
    player_game(球员编号,姓名,年龄,比赛编号,比赛时间,比赛场地)
    这里候选键是(球员编号,比赛编号)->(姓名,年龄,比赛时间,比赛场地,得分)
    但是这个表不满足二范式,因为(球员编号)->(姓名,年龄) (比赛编号)->(比赛时间,比赛场地)
    也就是说候选键中的某个字段决定了非主属性。

不满足2NF的缺点:

  • 数据冗余

  • 插入异常

  • 删除异常

  • 更新异常

  • 3NF
    3NF在满足2NF的同时,对任何非主属性都不传递依赖于候选键。也就是非主属性A依赖于非主属性B,非主属性B依赖于候选键的情况。
    例子:
    plyer(球员编号,姓名,球队名称,球队教练)
    其中球队名称->球队教练,因此球队教练和候选键之间是一种依赖传递

课后习题:
我们现在有一张学生选课表,包含的属性有学号、姓名、课程名称、分数、系别和系主任,如果要改成符合 3NF 要求的设计,需要怎么修改呢?
解答:
1.学生表:学号(主键),姓名,系别编号(外键)
2.课程表:课程编号(主键),课程名称
3.成绩表: 学号,课程编号,分数(学号和课程编号)
4.院系表:系别编号(主键),系别(名称),系主任

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值