博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MYSQL三大范式
阅读量:6086 次
发布时间:2019-06-20

本文共 3549 字,大约阅读时间需要 11 分钟。

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

第一范式是最基本的范式。

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

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

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

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

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范式只消除了插入异常。 
&&&&❤❤❤❤❤❤❤❤不符合第三范式的例子: ❤❤❤❤❤❤❤❤&&&&&&&&&&
学号, 姓名, 年龄, 所在学院, 学院联系电话,关键字为单一关键字"学号"; 
存在依赖传递: (学号) → (所在学院) → (学院地点, 学院电话) 
存在问题: 
数据冗余:有重复值; 
更新异常:有重复的冗余信息,修改时需要同时修改多条记录,否则会出现数据不一致的情况 
删除异常 
修正: 
学生:(学号, 姓名, 年龄, 所在学院); 
学院:(学院, 地点, 电话)。 

转载于:https://www.cnblogs.com/liliuguang/p/9592066.html

你可能感兴趣的文章
低版本Samba无法挂载
查看>>
Telegraf+Influxdb+Grafana构建监控平台
查看>>
使用excel 展现数据库内容
查看>>
C#方法拓展
查看>>
MySql.Data.dll的版本
查看>>
Linux系统磁盘管理
查看>>
hdu 2191 (多重背包+二进制优化)
查看>>
home.php
查看>>
neo4j---删除关系和节点
查看>>
redis分布式锁redisson
查看>>
什么样的企业可以称之为初创企业?
查看>>
Python爬虫之BeautifulSoup
查看>>
《HTML 5与CSS 3权威指南(第3版·下册)》——第20章 使用选择器在页面中插入内容...
查看>>
如何判断自己适不适合做程序员?这几个特点了解一下
查看>>
newinstance()和new有什么区别
查看>>
android下载封装类
查看>>
[node] 用 node-webkit 开发桌面应用
查看>>
Nginx访问控制和虚拟主机
查看>>
report widget not working for external users
查看>>
windows phone 摄像头得到图片是旋转90°
查看>>