zoukankan      html  css  js  c++  java
  • 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范式只消除了插入异常。 


    不符合第三范式的例子: 

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

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

    存在问题: 

    数据冗余:有重复值; 

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

    删除异常 

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

  • 相关阅读:
    matlab播放音乐
    virtualbox安装增强功能时【未能加载虚拟光盘】
    VirtualBox piix4_smbus Error
    VirtualBox虚拟机运行Ubuntu如何不卡
    微信支付注意事项
    ListView实现RadioButton的单选效果
    他山之石____Java 线程池的原理与实现
    线程池的使用____银行业务调度系统
    基础加强____【动态代理 & AOP】【实现类Spring的AOP框架】
    基础加强____【Java类加载器 & "委托机制"】
  • 原文地址:https://www.cnblogs.com/qq1312583369/p/10223180.html
Copyright © 2011-2022 走看看