数据库范式

2017年9月2日 4811点热度 0人点赞 0条评论

整理了下数据库的范式,个人理解,可能有些不充分的地方

  • 定义:
    • 主键:数据库表中对储存数据对象予以唯一和完整标识的数据列或属性的组合。
    • 超键:唯一标识出不同行的属性的集合。
    • 候选键:唯一标识出不同行的属性的最小集合。
    • 主属性:所有候选键中的属性
  • 1nf :
    • 目的消除重复组
    • 例子1:在某表中有教师、学生两个字段,其中某行,教师字段为“张育人”,学生字段存了,“王小明,李小花,赵大勇”
    • 例子2:在某表中有用户姓名、用户信息两个字段,其中某行,用户姓名为“钱三万”,用户信息存了“生日:1987/6/1 ,城市:北京市,区:朝阳区”
    • 定义:数据库的每个列的值域都是由原子值组成每个字段的值都只能是单一值。
  • 2nf :
    • 目的:消除非主属性对键的部分依赖(包括候选键)(并不是对主属性的部分依赖)
    • 例子:在某表中有学号、科目、成绩、学分,表主键应为:学号和科目作为联合主键,然而学分只是由科目决定的,当存入数据库数据时,学分这一项是有很多冗余的,将学分与科目拿出来单独做一张表即可。
    • 定义:数据表里的所有数据都要和该数据表的键(主键与候选键)有完全依赖关系。非主属性是由主键决定的,并非主键中的某单一元素确定的。只有一个主键的表一定是满足2nf。
  • 3nf :
    • 目的:消除非主属性间的依赖
    • 例子:存在某张表字段为学号、导师号、导师姓名。(这里导师和学生关系是一对多)其中学号为主键。明显导师姓名与导师号的依赖关系更强。存在学号->导师号->导师姓名的传递依赖关系。
    • 定义:有非键属性都只和候选键有相关性,也就是说非键属性之间应该是独立无关的。
  • bsnf :
    • 目的:消除主属性对非包含自己的候选键的依赖;消除了主属性对非主属性的依赖
    • 例子:有一个表有字段学号、教师号、科目、成绩(假设一个教师只教一科)。候选键为(学号、教师号)(学号、科目)。当某个科目换教师时,需要更改大量数据。(这个举例在具体实行不是很恰当,不过也体现出关系了)
    • 定义:所有非主属性都完全函数依赖于每个候选键,所有主属性都完全函数依赖于每个不包含它的候选键,没有任何属性完全函数依赖于非候选键的任何一组属性

 

  • 参考:
    • https://www.zhihu.com/question/24696366
    • https://baike.baidu.com/item/范式
    • https://zh.wikipedia.org/wiki/关系键
    • https://zh.wikipedia.org/wiki/第一正规化

icebmji

这个人很懒,什么都没留下