第一范式、第二范式、第三范式

摘抄自https://www.zhihu.com/question/24696366

  1. 函数依赖:若在一张表中,在属性(或属性组)X 的值确定的情况下,必定能确定属性 Y 的值,那么就可以说Y函数依赖于X,写作 X → Y(一个 X 不会对应两个 Y,Y = f(X))
  2. 完全函数依赖:属性集X → Y,对于X的任意真子集X’,都有 X’ !→ Y,则称 Y完全函数依赖于X
  3. 部分函数依赖:属性集X → Y,存在X的某个真子集X’,有 X’ → Y,则称 Y部分函数依赖于X
  4. 传递函数依赖:X → Y,Y → Z (前提:Y 不包含于 X,且 Y !→ X),那么我们就称 Z 传递函数依赖于 X

第一范式、第二范式、第三范式_第1张图片

  1. 学号 → 姓名,系名 → 系主任
  2. 分数 完全函数依赖于 姓名+课程;分数 完全依赖于 学号+课程
  3. 系名 部分函数依赖于 学号+姓名;因为单拿出来 学号可以确定系名(系名 函数依赖于 学号);单拿出来 姓名也可以确定系名
  4. 系主任 传递函数依赖于 学号;学号确定系名,系名确定系主任

注意:满足第二范式,一定满足第一范式;满足第三范式,一定满足第二范式

  1. 第一范式:列不可分
    第一范式是最基本的范式,数据表中的所有字段都是不可拆分的原子值,就说明数据表满足第一范式
    下标不符合第一范式:
    第一范式、第二范式、第三范式_第2张图片

  1. 第二范式:不存在非主属性对候选码的部分依赖
  1. 找出所有的候选码 (能够标识一组数据唯一性的最小属性集)
  2. 所有候选码中包括的属性叫作主属性
  3. 主属性以外的属性叫作非主属性
  4. 判断是否存在非主属性是否对候选码的部分函数依赖

第一范式、第二范式、第三范式_第3张图片

分析上图:

  1. 候选码:学号+课程 ((能够标识一组数据唯一性的最小属性集))
    查看所有每一单个属性,当它的值确定了,是否剩下的所有属性值都能确定。
    查看所有包含有两个属性的属性组,当它的值确定了,是否剩下的所有属性值都能确定。
    ……
    查看所有包含了六个属性,也就是所有属性的属性组,当它的值确定了,是否剩下的所有属性值都能确定。
    第一范式、第二范式、第三范式_第4张图片
  2. 主属性:学号、课程
  3. 非主属性:姓名、系名、系主任、分数
  4. 判断:姓名、系名、系主任 都 部分函数依赖于 候选码
  5. 结论:不符合第二范式

将表拆分,两个表都符合第二范式
第一范式、第二范式、第三范式_第5张图片

  1. 第一张表:
    候选码:学号+课程
    主属性:学号、课程
    非主属性:分数
    判断:分数完全函数依赖于(学号+课程)
  2. 第二张表:
    候选码:学号(考虑重名,姓名就不列为候选键)
    主属性:学号
    非主属性:姓名、系名、系主任
    判断:非主属性完全函数依赖于候选码

  1. 第三范式:不存在非属性码对候选键的传递函数依赖
    第一范式、第二范式、第三范式_第6张图片

观察上表,

  1. 候选码:学号
  2. 主属性:学号
  3. 非主属性:姓名、系名、系主任
  4. 判断:学号 → 系名,系名 → 系主任
  5. 不符合第三范式

第一范式、第二范式、第三范式_第7张图片


  1. BCNF是第三范式的改进

一个满足BCNF的关系模式的条件:

  1. 所有非主属性对每一个码都是完全函数依赖。
  2. 所有的主属性对每一个不包含它的码,也是完全函数依赖。
  3. 没有任何属性完全函数依赖于非码的任何一组属性。

水润鹅鸣 生态广平

河北邯郸
第一范式、第二范式、第三范式_第8张图片

你可能感兴趣的:(MySQL,mysql)