网上搜罗了一大堆关于数据库范式理解的文章,都是千律一篇的复制粘贴,连例子都是如出一辙,拜托有点创意好不,实在看不下去,本身写一篇我的理解三范式的文章。若是有理解上的不正确之处,请联系指正。 数据库
官方定义:第一范式(1NF):数据库表中的字段都是单一属性的,不可再分。
个人理解:第一范式这个不用說了,只要是关系数据库都知足第一范式 数据库设计
官方定义:第二范式(2NF):数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖
个人理解:在第二范式中组合主键(AB)【注明:也叫作复合主键】里面的A或者B 与其余字段不能存在组合重复,为解决这个问题,一般的作法是我们不用组合主键,添加一个ID,作为单一主键便可知足第二范式。若是不想添加ID,请知足组合主键(AB)里面的A或者B 与其余字段不能存在组合重复。
如:不知足第二范式,复合主键中的A与字段C组合重复
+------------+-----------+-------------------+
pk pk row
+------------+-----------+-------------------+
A B C
+------------+-----------+-------------------+
A D C
+------------+-----------+-------------------+
A E C
+------------+-----------+-------------------+ 函数
改成这样知足第二范式(可是不知足第三范式,字段A与字段C是组合重复):
+---------+------------+-----------+-------------------+
pk row row row
+---------+------------+-----------+-------------------+
1 A B C
+---------+------------+-----------+-------------------+
2 A D C
+---------+------------+-----------+-------------------+
3 A E C
+---------+------------+-----------+-------------------+ 设计
官方定义:第三范式(3NF):在第二范式的基础上,数据表中若是不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三 范式。
个人理解:在第三范式中字段与字段之间不能存在组合重复
如:不知足第三范式,字段A与字段C组合重复
+---------+------------+-----------+-------------------+---------------+
pk row row row row
+---------+------------+-----------+-------------------+---------------+
1 A B C F
+---------+------------+-----------+-------------------+---------------+
2 A D C G
+---------+------------+-----------+-------------------+---------------+
3 A E C K
+---------+------------+-----------+-------------------+---------------+ code
改成这样知足第三范式:
表1
+---------+------------+-----------+
pk row row
+---------+------------+-----------+
1 A B
+---------+------------+-----------+
2 A D
+---------+------------+-----------+
3 A E
+---------+------------+-----------+
和表2
+---------+-------------------+------------+
pk row row
+---------+-------------------+------------+
1 C F
+---------+-------------------+------------+
2 C G
+---------+-------------------+------------+
3 C K
+---------+-------------------+------------+ class
原则:当出现字段与字段的组合重复,如上的A和C的组合重复,首先要考虑的就是把他们拆分为2个表,具体是C拆到表1, 仍是A拆到表1,看状况而定. 基础
关键要理解定义这种范式标准的主要目的是为了减小数据冗余,数据冗余产生的本质就是在一个表中存在字段与字段之间的一对多,或者多对多关系。解决这个几对几的关系问题,就能轻易实现知足第三范式的数据库设计。
原理
基础原理: 数据
构造数据库必须遵循必定的规则。在关系数据库中,这种规则就是范式。范式是符合某一种级别的关系模式的集合。关系数据库中的关系必须知足必定的要求,即知足不一样的范式。目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、第四范式(4NF)、第五范式(5NF)和第六范式(6NF)。知足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步知足更多要求的称为第二范式(2NF),其他范式以次类推。通常说来,数据库只需知足第三范式(3NF)就好了。下面咱们举例介绍第一范式(1NF)、第二范式(2NF)和第三范式(3NF)。 3.4.1 第一范式(1NF) 在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不知足第一范式(1NF)的数据库就不是关系数据库。 所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。若是出现重复的属性,就可能须要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。在第一范式(1NF)中表的每一行只包含一个实例的信息。例如,对于图3-2 中的员工信息表,不能将员工信息都放在一列中显示,也不能将其中的两列或多列在一列中显示;员工信息表的每一行只表示一个员工的信息,一个员工的信息在表中只出现一次。简而言之,第一范式就是无重复的列。 3.4.2 第二范式(2NF) 第二范式(2NF)是在第一范式(1NF)的基础上创建起来的,即知足第二范式(2NF)必须先知足第一范式(1NF)。第二范式(2NF)要求数据库表中的每一个实例或行必须能够被唯一地区分。为实现区分一般须要为表加上一个列,以存储各个实例的唯一标识。如 图3-2 员工信息表中加上了员工编号(emp_id)列,由于每一个员工的员工编号是唯一的,所以每一个员工能够被唯一区分。这个唯一属性列被称为主关键字或主键、主码。 第二范式(2NF)要求实体的属性彻底依赖于主关键字。所谓彻底依赖是指不能存在仅依赖主关键字一部分的属性,若是存在,那么这个属性和主关键字的这一部分应该分离出来造成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分一般须要为表加上一个列,以存储各个实例的唯一标识。简而言之,第二范式就是非主属性非部分依赖于主关键字。 3.4.3 第三范式(3NF) 知足第三范式(3NF)必须先知足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。例如,存在一个部门信息表,其中每一个部门有部门编号(dept_id)、部门名称、部门简介等信息。那么在图3-2 的员工信息表中列出部门编号后就不能再将部门名称、部门简介等与部门有关的信息再加入员工信息表中。若是不存在部门信息表,则根据第三范式(3NF)也应该构建它,不然就会有大量的数据冗余。简而言之,第三范式就是属性不依赖于其它非主属性。 简单的解释: 最基本的数据库范式有三个,第一范式(1NF),第二范式(2NF)和第三范式(3NF),分别定义以下, 1NF:若是关系模式R中的每一个属性都是单值的,则称R∈1NF。 2NF:若是关系模式R∈1NF,且全部的非主属性彻底函数依赖于(每个候选)码,则称R∈2NF。 3NF:若是关系模式R∈2NF,且不存在非主属性传递函数依赖于码的状况,则称R∈3NF。