Oracle数据库设计三范式

来源:互联网 发布:mysql数据库无法写入 编辑:程序博客网 时间:2024/09/21 06:18

官方定义:第一范式(1NF):数据库表中的字段都是单一属性的,不可再分。
我的理解:第一范式这个不用說了,只要是关系数据库都满足第一范式

官方定义:第二范式(2NF):数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖
我的理解:在第二范式中组合主键(AB)【注明:也叫做复合主键】里面的A或者B 与其他字段不能存在组合重复,为解决这个问题,通常的做法是咱们不用组合主键,添加一个ID,做为单一主键即可满足第二范式。如果不想添加ID,请满足组合主键(AB)里面的A或者B 与其他字段不能存在组合重复。
如:不满足第二范式,复合主键中的A与字段C组合重复

  1. +------------+-----------+-------------------+
  2.     pk                pk             row
  3. +------------+-----------+-------------------+
  4.     A                  B                  C
  5. +------------+-----------+-------------------+
  6.     A                  D                  C
  7. +------------+-----------+-------------------+
  8.     A                  E                  C
  9. +------------+-----------+-------------------+
复制代码

改为这样满足第二范式(但是不满足第三范式,字段A与字段C是组合重复):

  1. +---------+------------+-----------+-------------------+
  2.     pk            row             row             row
  3. +---------+------------+-----------+-------------------+
  4.       1              A               B                  C
  5. +---------+------------+-----------+-------------------+
  6.       2              A               D                  C
  7. +---------+------------+-----------+-------------------+
  8.       3              A               E                  C
  9. +---------+------------+-----------+-------------------+
复制代码

官方定义:第三范式(3NF):在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三 范式。
我的理解:在第三范式中字段与字段之间不能存在组合重复
如:不满足第三范式,字段A与字段C组合重复

  1. +---------+------------+-----------+-------------------+---------------+
  2.     pk            row             row             row                        row
  3. +---------+------------+-----------+-------------------+---------------+
  4.       1              A               B                  C                           F
  5. +---------+------------+-----------+-------------------+---------------+
  6.       2              A               D                  C                          G
  7. +---------+------------+-----------+-------------------+---------------+
  8.       3              A               E                  C                           K
  9. +---------+------------+-----------+-------------------+---------------+
复制代码

改为这样满足第三范式:
表1

  1. +---------+------------+-----------+
  2.     pk            row            row         
  3. +---------+------------+-----------+
  4.       1              A               B               
  5. +---------+------------+-----------+
  6.       2              A               D                 
  7. +---------+------------+-----------+
  8.       3              A               E                 
  9. +---------+------------+-----------+
复制代码
和表2
  1. +---------+-------------------+------------+
  2.     pk             row                       row
  3. +---------+-------------------+------------+
  4.       1              C                           F
  5. +---------+-------------------+------------+
  6.       2              C                           G
  7. +---------+-------------------+------------+
  8.       3              C                           K
  9. +---------+-------------------+------------+
复制代码

原则:当出现字段与字段的组合重复,如上的A和C的组合重复,首先要考虑的就是把他们拆分为2个表,具体是C拆到表1, 还是A拆到表1,看情况而定.

关键要理解定义这种范式标准的主要目的是为了减少数据冗余,数据冗余产生的本质就是在一个表中存在字段与字段之间的一对多,或者多对多关系。解决这个几对几的关系问题,就能轻易实现满足第三范式的数据库设计。

转自:http://www.askoracle.org/forum.php?mod=viewthread&tid=29