MySQL三范式

1.确保每列的原子性.

第一范式是最基本的范式。数据库表中的字段都是单一属性的,不可再分。只要是关系数据库都满足第一范式

如果每列(或者每个属性)都是不可再分的最小数据单元(也称为最小的原子单元),则满足第一范式.

例如:顾客表(姓名、编号、地址、……)其中"地址"列还可以细分为国家、省、市、区等。

2确保表中的每列都和主键相关.

如果一个关系满足第一范式,并且除了主键以外的其它列,都依赖于该主键,则满足第二范式.

例如:订单表(订单编号、产品编号、定购日期、价格、……),"订单编号"为主键,"产品编号"和主键列没有直接的关系,即"产品编号"列不依赖于主键列,应删除该列。

***********************************************************

不满足第二范式,复合主键中的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
+---------+------------+-----------+-------------------+

****************************************************************

3.确保每列都和主键列直接相关,而不是间接相关.

如果一个关系满足第二范式,并且除了主键以外的其它列都不依赖于主键列,则满足第三范式.

为了理解第三范式,需要根据Armstrong公里之一定义传递依赖。假设A、B和C是关系R的三个属性,如果A-〉B且B-〉C,则从这些函数依赖中,可以得出A-〉C,如上所述,依赖A-〉C是传递依赖。

例如:订单表(订单编号,定购日期,顾客编号,顾客姓名,……),初看该表没有问题,满足第二范式,每列都和主键列"订单编号"相关,再细看你会发现"顾客姓名"和"顾客编号"相关,"顾客编号"和"订单编号"又相关,最后经过传递依赖,"顾客姓名"也和"订单编号"相关。为了满足第三范式,应去掉"顾客姓名"列,放入客户表中。

**********************************************************************

不满足第三范式,字段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
+---------+-------------------+------------+

************************原则:************************************

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

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

总结:

1NF:字段不可分; 
2NF:有主键,非主键字段依赖主键; 
3NF:非主键字段不能相互依赖; 

解释: 
1NF:原子性 字段不可再分,否则就不是关系数据库; 
2NF:唯一性 一个表只说明一个事物; 
3NF:每列都与主键有直接关系,不存在传递依赖; 

不符合第一范式的例子(关系数据库中create不出这样的表): 

表:字段1, 字段2(字段2.1, 字段2.2), 字段3 ...... 

存在的问题: 因为设计不出这样的表, 所以没有问题; 

不符合第二范式的例子: 

表:学号, 姓名, 年龄, 课程名称, 成绩, 学分; 

这个表明显说明了两个事务:学生信息, 课程信息; 

***********************存在问题: *********************

数据冗余,每条记录都含有相同信息; 
删除异常:删除所有学生成绩,就把课程信息全删除了; 
插入异常:学生未选课,无法记录进数据库; 
更新异常:调整课程学分,所有行都调整。 

***********************修正:****************************** 

学生:Student(学号, 姓名, 年龄); 

课程:Course(课程名称, 学分); 

选课关系:SelectCourse(学号, 课程名称, 成绩)。 

满足第2范式只消除了插入异常。 


不符合第三范式的例子: 

学号, 姓名, 年龄, 所在学院, 学院联系电话,关键字为单一关键字"学号"; 

存在依赖传递: (学号) → (所在学院) → (学院地点, 学院电话) 

存在问题: 

数据冗余:有重复值; 

更新异常:有重复的冗余信息,修改时需要同时修改多条记录,否则会出现数据不一致的情况 

删除异常 

修正: 
学生:(学号, 姓名, 年龄, 所在学院); 
学院:(学院, 地点, 电话)。 

猜你喜欢

转载自www.cnblogs.com/qq1312583369/p/10223180.html