第二范式 [MySQL][数据库]

第二范式

满足第二范式的前提是要满足第一范式
第二范式:

第二范式要求在满足第一范式的基础上,还要满足数据表里的每一条数据记录都是可以唯一标识的(也就是有主键),并且所有的非主键字段,都必须完全依赖主键,不能只依主键的一部分

  • 那么什么叫做完全依赖于主键?
    • 比如一个复合主键(也就是主键中有多个属性),这里我们说假如是这个主键中有两个属性(球员编号和比赛编号),这个时候假如这个表中有一个非主属性是得分,那么我们的得分字段值通过主键中的两个属性的任意其中之一都不能确定,必须要通过主键中的所有属性才可以确定这个非主属性值,那么就称这个这个非主属性完全依赖与主键
  • 那么相对的什么叫部分依赖于主键?
    • 比如还是上面的复合主键(球队编号和比赛编号),这个时候有一个属性是姓名,那么我们只需要通过主键中的球员编号就可以确定姓名了,那么我们就将姓名这个非主键字段称之为部分依赖于主键
下面我们通过一个例子来理解第二范式:

比赛表(player_game)里面包含球员编号,姓名,年龄,比赛编号,比赛时间,比赛场地,得分几个属性,这里的候选键和主键都为(球员编号,比赛编号),我们可以通过主键(或者候选键)来决定如下关系:

  • 这个比赛表并不满足第二范式,因为数据表中的字段间还存在着如下的对应关系:

    1. (球队编号) 可以唯一确定 (姓名 , 年龄)
    2. (比赛编号) 可以唯一确定(比赛时间, 比赛场地)
    • 这个时候上面的年龄,姓名,比赛时间,比赛场地都是部分依赖于主键字段,而对于得分属性则是完全依赖于主键
那么我们的第二范式为什么要求非主属性要完全依赖于主键?如果非主属性部分依赖于主键会产生怎么样的问题?(还是上面的比赛表为例:)
  1. 数据冗余:
    • 如果一个球员可以参加m场比赛,那么球星的姓名和年龄就在表中重复了m-1次,如果一场比赛有n个球员参加,那么比赛的时间地点就重复了n-1次
  2. 插入异常:
    • 如果我们向要添加一场新的比赛,但是这个时候还没有确定参加的球员都有谁,这个时候就没有办法插入数据到表中
  3. 删除异常:
    • 如果我们要删除某个球员编号,如果没有单独保存比赛表的话,这个时候就会同时把比赛信息删除掉
      • 有可能我们的一个比赛中只有一个球员,那么我们删除这个球员的时候,对应的这个唯一的这个比赛也就一起删除了
  4. 更新异常:
    • 如果我们调整了某个比赛的时间,那么数据表中所有的这场比赛的时间都需要进行调整,否则就会出现是异常比赛,但是比赛时间不同的情况
      • 可能有多个球员参加一场比赛,这个时候要修改这场比赛的时间,那么对于参加这个比赛的多个球员对应记录中的比赛时间都是要进行修改的
那么可以把比赛表设计为下面的三张表(那么就可以满足2NF了):

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sb3iRqEf-1649261477547)(E:\非凡英才\java笔记\图解\满足2NF的比赛表设计.png)]

  • 这样设计的话,每张表都符合了第二范式了,也就避免了上面几种异常的发生

总结:

  1. 第二范式(2NF)要求实体(表)中的非主键字段完全依赖于主键,如果存在不完全依赖于主键的非主键字段,那么这个不完全依赖主键的字段和主键中的这一部分就要分离出来形成一个新表(新实体),新实体(表)和元实体(表)之间是一对多的关系

    • 上面说的拿出来主键中的一部分就是拿出主键中被这个字段完全依赖的一部分主键字段
    • 为什么新表和元表示一对多的关系?
      • 因为新实体(表)是一部分主键组成的,而元实体(表)还是原来的完整的主键,那么假如以上面的例题为例,这里的新实体(表)为: (球员编号 ,姓名 , 年龄),而元实体(表)为(球员编号,比赛编号,得分), 那么这个时候一条新表中的记录就是在元表中可能就是多个记录,因为在元表中一个球员可能参加了多场比赛,所以我们说新表和元表之间是一种一对多的关系
  2. 1NF告诉我们字段属性是需要原子性的,而2NF告诉我们一张表就是一个独立的对象,一张表只能表达一个意思

    • 也就是可以说1NF是字段的原子性,而2NF是表的原子性
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值