第一范式(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的组合重复,首先要考虑的就是把他们拆分为2个表,具体是C拆到表1, 还是A拆到表1,看情况而定.
如:不满足第三范式,字段A与字段C组合重复
+---------+------------+-----------+-------------------+---------------+
pk row row row row
+---------+------------+-----------+-------------------+---------------+
1 A B C F
+---------+------------+-----------+-------------------+---------------+
2 A D C G
+---------+------------+-----------+-------------------+---------------+
3 A E C K
+---------+------------+-----------+-------------------+---------------+
改为这样满足第三范式:
表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
+---------+-------------------+------------+
关键要理解定义这种范式标准的主要目的是为了减少数据冗余,数据冗余产生的本质就是在一个表中存在字段与字段之间的一对多,或者多对多关系。解决这个几对几的关系问题,就能轻易实现满足第三范式的数据库设计。
范式要解决的就是数据冗余的问题:
第二范式:
-
不符合第二范式的例子
货物类型 | 货物ID | 货物名称 | 注意事项 |
瓷碗 | 1 | 白色瓷碗 | 易碎品 |
瓷碗 | 2 | 青花瓷碗 | 易碎品 |
瓷碗 | 3 | 雕花瓷碗 | 易碎品 |
三合板 | 1 | 普通三合板 | 易燃物品,注意防火 |
在上面这数据中,我们把一行看做数据库的一条数据。我们可以看到【货物名称】这列是依赖于【货物类型】、【货物ID】这两列复合主键的,【注意事项】也是依赖于【货物类型】、【货物ID】这两项的。但是仔细查看,却发现【注意事项】这列可以单独依赖于【货物类型】这列的,于是出现了数据对主键的部分依赖的问题,这就违反了第二范式。
第三范式:
每个非关键字列都独立于其他非关键字列,并依赖于关键字,第三范式指数据库中不能存在传递函数依赖关系。
第二范式讲的是非主键对主键的部分依赖问题。
第三范式讲的是非主键对非主键的依赖问题。 (所谓依赖,就是指的数据可否提取成新的数据的问题。)
BNCF范式