数据库三范式的理解

范式所描述的是:表设计时,达到的某种级别的标准。就像家里装修买建材,最环保的是E0级,其次是E1级,还有E2级等等设计

这样的标准有:1NF,2NF,3NF,BCNF,4NF,5NF。table

1NF

要求:表中每一列是不能再分割的。搜索

设计一个表存储用户信息:统计

用户ID 用户信息
1 小明21岁
2 小红31岁

这种设计不符合1NF,由于用户信息那一列还能够继续分割,应该将名称和年龄拆分出来成两列。总结

再看一个边缘化的例子:数据

用户ID 名称 年龄 地址
1 小明 21岁 广东省珠海市斗门区XX路
2 小红 31岁 广东省珠海市香洲区AA路

一看,这个地址列其实还能够继续拆分出多列,如省、市、区、路4列等。若是不进行拆分的话,那这个表设计就不符合1NF了吗?不是的。tab

结论:每一列要不要继续拆分,是跟系统的业务有关的,若是业务有要求(如以上我要对某个省进行搜索,对某个区的人员数据进行统计等),而设计表时却没有拆分,则这样的设计不符合1NF。因此是否符合1NF,不能光看表的设计,还要依据业务须要来判断。分割

2NF

要求:消除非主属性对主属性(主键、能惟一标识某一行)的部分依赖。范式

这句话包含的信息量比较大,换一个角度来理解这句话:ab

  • 若是主属性只有一个,则一定知足2NF,而不要求其余属性是否依赖于这个主属性。
  • 若是主属性有多个,而其余属性要么依赖于这多个主属性,要么不依赖于任意一个主属性,这样也知足2NF。

结论:只要不出现部分依赖便可,而其余属性是否依赖于主属性,这点没有要求。

3NF

要求:非主属性彻底依赖于主属性。

以上“彻底依赖”这个词,可见已经包含了2NF,彻底依赖则意味着不会出现部分依赖。

一个不知足3NF的学生信息表:

学生ID 学生名称 院系主任名称

“院系主任名称”这一列是不依赖于“学生ID”,而只依赖于某个院系,这是和学生没有关系的。正确作法应该再拆出来一个院系表,里面创建院系与院系主任名称的关系。

回顾2NF,能发现以上例子,就是知足了2NF(没有出现部分依赖),却不知足3NF。

最后总结

以上三个范式的要求,要看是否知足,其实都是须要与业务进行关联的。只不过对于大部分表的设计,一看就能知道业务是怎么样,因此就直接跳过业务解释,则纯粹的来讨论表的设计,以此来判断是否知足范式。就以上面3NF中的例子来讲,只要你说你的业务与常规业务不同,而且能解释得通,你系统里面的院系主任名称是依赖于学生ID的,那你这个表的设计就是知足3NF的。以及2NF中提到的主属性,表中的列是不是主属性,其实都是取决于业务,还有属性之间是不是存在依赖关系,也仍是取决于业务。

相关文章
相关标签/搜索