MYSQL三大范式

第一范式:确保每列的原子性.

第一范式是最基本的范式。数据库

数据库表中的字段都是单一属性的,不可再分。数据库设计

只要是关系数据库都知足第一范式函数

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

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

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,看状况而定

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

****************************总结***************************

归结起来3句话: 

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

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

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

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

存在的问题: 由于设计不出这样的表, 因此没有问题; 

不符合第二范式的例子: 

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

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

***********************存在问题: *********************数据冗余,每条记录都含有相同信息; 删除异常:删除全部学生成绩,就把课程信息全删除了; 插入异常:学生未选课,没法记录进数据库; 更新异常:调整课程学分,全部行都调整。 ***********************修正:****************************** 学生:Student(学号, 姓名, 年龄); 课程:Course(课程名称, 学分); 选课关系:SelectCourse(学号, 课程名称, 成绩)。 知足第2范式只消除了插入异常。 &&&&❤❤❤❤❤❤❤❤不符合第三范式的例子: ❤❤❤❤❤❤❤❤&&&&&&&&&&学号, 姓名, 年龄, 所在学院, 学院联系电话,关键字为单一关键字"学号"; 存在依赖传递: (学号) → (所在学院) → (学院地点, 学院电话) 存在问题: 数据冗余:有重复值; 更新异常:有重复的冗余信息,修改时须要同时修改多条记录,不然会出现数据不一致的状况 删除异常 修正: 学生:(学号, 姓名, 年龄, 所在学院); 学院:(学院, 地点, 电话)。