最近在学习数据库设计中的范式,做作业的时候总觉得理解有点偏差,于是在网上找了找解释,觉得下面这两篇文章都讲的挺好的。
第一篇是知乎里的回答,第二篇是一个人写的博文。我把其中觉得不错的东西又整理了一下。
引用自
https://www.zhihu.com/question/24696366
http://www.cnblogs.com/CareySon/archive/2010/02/16/1668803.html
范式的目标
应用数据库范式可以带来许多好处,但是最重要的好处归结为三点:
1.减少数据冗余(这是最主要的好处,其他好处都是由此而附带的)
2.消除异常(插入异常,更新异常,删除异常)
3.让数据组织的更加和谐
什么是范式
简单的说,范式是为了消除重复数据减少冗余数据,从而让数据库内的数据更好的组织,让磁盘空间得到更有效利用的一种标准化标准。满足高等级的范式的先决条件是满足低等级范式。(比如满足2nf一定满足1nf)。 或者说是
一张数据表的表结构所符合的某种设计标准的级别
第一范式(1NF)
如果一个关系模式R的所有属性都是不可分的基本数据项,则R∈1NF。简单的说,第一范式就是每一个属性都不可再分。不符合第一范式则不能称为关系数据库。
第二范式(2NF)
若关系模式R∈1NF,并且每一个非主属性都完全函数依赖于R的码,则R∈2NF。简单的说,是表中的属性必须完全依赖于全部主键,而不是部分主键.所以只有一个主键的表如果符合第一范式,那一定是第二范式。这样做的目的是进一步减少插入异常和更新异常。
例:若一张表中有两个主键,则该表所有属性必须都依赖于这两个主键而不能只依赖其中一个。
2NF在1NF的基础之上,消除了非主属性对于码的部分函数依赖。
[注1]函数依赖:若在一张表中,在属性(或属性组)X的值确定的情况下,必定能确定属性Y的值,那么就可以说Y函数依赖于X,写作 X → Y。直观的说,在数据表中,不存在任意两条记录,它们在X属性(或属性组)上的值相同,而在Y属性上的值不同。(只要满足后者便可以说存在依赖关系)
–>完全函数依赖:若X → Y,且对于 X 的任何一个真子集(假如属性组 X 包含超过一个属性的话),X ’ → Y 不成立
–>部分函数依赖:假如Y函数依赖于X且Y并不完全函数依赖于X,那么我们就称Y部分函数依赖于X
–>传递函数依赖:Z->Y,Y->X,则Z->X
[注2]码:设K为某表中的一个属性或属性组,若除K之外的所有属性都完全函数依赖于K,那么我们称K为候选码,简称为码。即,假如当K确定的情况下,该表除K之外的所有属性的值也就随之确定,那么K就是码。一张表中可以有多个码。通常选择其中的一个码作为主码。
[注3]非主属性:包含在任何一个码中的属性成为主属性。
判断是否符合2NF的步骤:
1、找出数据表中所有的码。
2、根据第一步所得到的码,找出所有的主属性。
3、数据表中,除去所有的主属性,剩下的就都是非主属性了。
4、查看是否存在非主属性对码的部分函数依赖。
第三范式(3NF)
关系模式R 中若不存在这样的码X、属性组Y及非主属性Z(Z Y), 使得X→Y,Y→Z,成立,则称R∈ 3NF。简单的说,第三范式是为了消除数据库中关键字之间的依赖关系。
3NF在2NF的基础之上,消除了非主属性对于码的传递函数依赖
BC范式(BCNF)
设关系模式R∈1NF,如果对于R的每个函数依赖X→Y,若Y不属于X,则X必含有候选码,那么R∈BCNF。BCNF保证每个表中只有一个候选键。
消除主属性对于码的部分函数依赖与传递函数依赖
[注1]候选键:在一个数据库中每行的值都不相同,则可称为候选键