• 三范式


    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范式只消除了插入异常。


    &&&&❤❤❤❤❤❤❤❤不符合第三范式的例子: ❤❤❤❤❤❤❤❤&&&&&&&&&&

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

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

    存在问题:

    数据冗余:有重复值;

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

    删除异常

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

  • 相关阅读:
    建立自己的开发知识库?分享制作电子书的经验
    海量Office文档搜索
    为什么要检测数据库连接是否可用
    多年的.NET开发,也只学会了这么几招
    总结一下ERP .NET程序员必须掌握的.NET技术
    菜单设计器(Menu Designer)及其B/S,C/S双重实现(B/S开源)
    软件公司为什么要加密源代码
    .NET开发中经常用到的扩展方法
    在Win8 Mertro 中使用SQLite
    SQLite
  • 原文地址:https://www.cnblogs.com/2734156755z/p/9305647.html
Copyright © 2020-2023  润新知