参考文章写的非常不错,给自己解惑了
参考文章:
https://www.zhihu.com/question/24696366
范式是“符合某一种级别的关系模式的集合,表示一个关系内部各属性之间的联系的合理化程度”
下面从第一范式(1NF)逐级上升解释
1NF的定义为:符合1NF的关系中的每个属性都不可再分。
EG:
以上的表并不满足1NF,易见 进货、销售两列是可再分的
1NF存在的问题有
修改异常
如对表
1.可见,姓名、等重复了很多次,此为数据冗余过大
2.假设学校新建了某一个系,但是暂时没有招收学生,那么就无法将系名和系主任的数据单独的添加进表(学生、学号等为空),此为插入异常
3.假设将经济系的学生全部删除,那么也将经济系本身也删除掉了,但是显然这是不符合逻辑的,此为删除异常
4.假设学生小明要转系,那么就需要将前3条关于小明的数据的系名、系主任等全部修改,以保证数据库中数据的一致性,此为修改异常
综上,为去掉以上4个问题,需要修改原先的设计。
2NF的定义为:NF在1NF的基础之上,消除了非主属性对于码的部分函数依赖。
需要明白的关键字有: 主属性、非主属性、码、部分函数依赖、函数依赖。
函数依赖:若在属性(或属性组)X的值确定的情况下,必定能确定属性Y的值,那么就说Y函数依赖于X,写作X → Y,也即,在表里不存在2条数据,它们的X值相等而Y却不相等。为何叫函数依赖可以和数学上的函数定义相比较,f(x)在x的值确定的情况下,y的值就为确定的。
完全函数依赖:若对X → Y,若X的任何一个真子集’X’ → Y不成立,即称X → Y为完全函数依赖,也就是说X中没有一项是多余的,去掉任何一个属性X → Y就不成立了。
部分函数依赖:与函数依赖相对应的,X → Y中X存在冗余属性。
码(键):设X为该表中的一个属性或属性组,若该表中除X之外的其余所有属性完全函数依赖于X
,也即X → Y,X+Y为表的所有属性,那么就称X为候选码,简称为码。一张表中可以存在多个码,实际应用中通常选择其中一个码为主码来唯一标识一个元组。
主属性:包含在任何一个码中的属性即为主属性。
非主属性:相对主属性而言的。
第一步:找出数据表中所有的码。
第二步:根据第一步所得到的码,找出所有的主属性。
第三步:数据表中,除去所有的主属性,剩下的就都是非主属性了。
第四步:查看是否存在非主属性对码的部分函数依赖。
怎样消除部分函数依赖呢?唯一可行的方法就是将原先的表进行拆分,此过程即为模式分解,注意,分解的方法不是唯一的。
待更新~