数据库的设计范式是数据库设计所须要知足的规范,若知足的数据库的规范,则该数据库是简洁的、结构明晰的,同时不会发生插入、删除、跟新操做异常。不然数据库的设计是不够合理的,会给编程人员带来不少麻烦,也可能会形成大量的数据冗余。下面谈一谈我最近对数据库范式的理解。数据库
我理解的第一范式就是:数据表中的每一列都是不可再分割的了,就是同一列不能有多个值,也不能有重复的列。例编程
姓名 | 电话 |
张三 | 12345678910;87946513216 |
这个例子就是电话这一列出现了两个电话号,这是不符合1NF的,咱们能够这样让他只添加一个电话号,或者再加一行。即数据库设计
姓名 | 电话 |
张三 | 12345678910 |
张三 | 87946513216 |
在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不知足第一范式(1NF)的数据库就不是关系数据库。spa
第二范式是在第一范式的基础上创建起来,即知足第二范式必须先知足第一范式。第二范式要求数据表中的每行的内容必须能够被惟一区分。简单来讲就是每个实例(行)都要有一个惟一标识(主键)。设计
例:现有一张选课关系表,字段包括(学号,姓名,年龄,课程名称,学分,成绩),关键字(主键)为(学号,课程名称),io
存在:(学号,课程名称)——>(姓名,年龄,学分,成绩),table
但这张表并非2NF,由于咱们能够看到他应存在:(课程名称)——>(学分)和(学号)——>(姓名,年龄)。基础
因此正确的2NF应该是将这张表拆分红三张表,即:学生表(学号,姓名,年龄),课程表(课程名称,学分),成绩表(学号,课程名称,成绩)数据
知足第三范式必须先知足第二范式,第三范式要求一个数据表中不包含已在其余表中已包含的非主键信息。简单来讲就是,一张数据表只能包含其余数据表的主键字段。例如现有一张部门表(部门ID,部门名称,地址),还有用户表(用户ID,用户姓名,部门ID,部门名称,地址)。这是不知足三范式的,由于在用户表中已经存在了“部门ID”,就不须要再写“部门名称”和“地址”了。若是咱们须要“部门名称”和“地址”的话,咱们能够这样(用户ID)——>(部门ID)——>(部门名称,地址)。因此,正确的三范式应该是,部门表(部门ID,部门名称,地址),还有用户表(用户ID,用户姓名,部门ID)。异常