范式所描述的是:表设计时,达到的某种级别的标准。就像家里装修买建材,最环保的是E0级,其次是E1级,还有E2级等等设计
这样的标准有:1NF,2NF,3NF,BCNF,4NF,5NF。table
要求:表中每一列是不能再分割的。搜索
设计一个表存储用户信息:统计
用户ID | 用户信息 |
1 | 小明21岁 |
2 | 小红31岁 |
这种设计不符合1NF,由于用户信息那一列还能够继续分割,应该将名称和年龄拆分出来成两列。总结
再看一个边缘化的例子:数据
用户ID | 名称 | 年龄 | 地址 |
1 | 小明 | 21岁 | 广东省珠海市斗门区XX路 |
2 | 小红 | 31岁 | 广东省珠海市香洲区AA路 |
一看,这个地址列其实还能够继续拆分出多列,如省、市、区、路4列等。若是不进行拆分的话,那这个表设计就不符合1NF了吗?不是的。tab
结论:每一列要不要继续拆分,是跟系统的业务有关的,若是业务有要求(如以上我要对某个省进行搜索,对某个区的人员数据进行统计等),而设计表时却没有拆分,则这样的设计不符合1NF。因此是否符合1NF,不能光看表的设计,还要依据业务须要来判断。分割
要求:消除非主属性对主属性(主键、能惟一标识某一行)的部分依赖。范式
这句话包含的信息量比较大,换一个角度来理解这句话:ab
结论:只要不出现部分依赖便可,而其余属性是否依赖于主属性,这点没有要求。
要求:非主属性都要彻底依赖于主属性。
以上“彻底依赖”这个词,可见已经包含了2NF,彻底依赖则意味着不会出现部分依赖。
一个不知足3NF的学生信息表:
学生ID | 学生名称 | 院系主任名称 |
“院系主任名称”这一列是不依赖于“学生ID”,而只依赖于某个院系,这是和学生没有关系的。正确作法应该再拆出来一个院系表,里面创建院系与院系主任名称的关系。
回顾2NF,能发现以上例子,就是知足了2NF(没有出现部分依赖),却不知足3NF。
以上三个范式的要求,要看是否知足,其实都是须要与业务进行关联的。只不过对于大部分表的设计,一看就能知道业务是怎么样,因此就直接跳过业务解释,则纯粹的来讨论表的设计,以此来判断是否知足范式。就以上面3NF中的例子来讲,只要你说你的业务与常规业务不同,而且能解释得通,你系统里面的院系主任名称是依赖于学生ID的,那你这个表的设计就是知足3NF的。以及2NF中提到的主属性,表中的列是不是主属性,其实都是取决于业务,还有属性之间是不是存在依赖关系,也仍是取决于业务。