zoukankan      html  css  js  c++  java
  • (十)范式


    范式

    范式(Normal format) ,是一种离散数学的知识,是为了解决数据的存储与优化的问题:保存数据以后,凡是能通过关系寻找出来的数据,坚决不再重复存储;终极目标是:减少一切冗余数据

    范式:是一种分层结构的规范,分为六层,每一层都比上一层更加严格;若要满足下一层范式,则必须满足上一层范式;

    六层范式:1NF、2NF、3NF、4NF、5NF、6NF;其中 1NF 是最底层,要求最低 ;

    Mysql 属于关系型数据库,有空间浪费,也致力于解决空间浪费的问题,这一条与范式不谋而合;因此,在设计数据库的时候,会利用范式来指导设计;

    但是数据库不仅仅只关注数据冗余问题,也要保证效率问题;但是范式只是为了解决数据冗余问题, 所以数据库的设计也不能完全按照范式的要求实现:一般情况下,只满足前三种范式 ;

    总之,范式在数据库的设计中,具有指导意义,但不是强制规范;


    1NF(第一范式)

    在设计表存储数据的时候,如果表中设计的字段存储的数据,在取出来使用之前,还需要进行额外的操作(拆分),那么该表的设计就不满足第一范式;

    第一范式,要求字段的数据具有原子性,不可拆分

    可以通过将数据,拆分为两个字段解决 ;


    2NF(第二范式)

    在数据表的设计过程中,如果有复合主键(多字段主键),且表中字段并不是都依赖整个复合主键,可以有的字段,只依赖复合主键中的部分字段,这将导致部分依赖,则该表的设计不满足第二范式 ;

    第二范式,要求表中的字段对主键绝对依赖,不允许出现部分依赖

    可以使用逻辑主键替代业务主键,解决部分依赖问题;亦可以使用多张表,将部分依赖的字段与其所依赖的部分主键单独成表;


    3NF(第三范式)

    在设计表的时候,如果一张表的某个字段,并不是直接依赖主键,而是依赖其他字段,然后其他字段依赖主键,则改表的设计不满足第三范式 ;

    第三范式,要求表中的字段都应该直接依赖主键,而不应该出现传递依赖(间接依赖)

    可以将存在传递依赖的字段与其所依赖的字段,抽取出来形成单表,然后在原表中,将单独表的主键添加进来,这样达到消除掉传递依赖的问题 ;


    逆范式化

    上面的第三范式,我们那样做以后,我们在查询数据的时候,需要多表查表,会减低我们的效率;

    因此有时候,会故意的逆范式,不将它们抽取成单表,而是让他们存在传递依赖,来提高查询效率,以牺牲数据冗余为资本;

    我们可以看出范式一层一层的往上,对数据冗余的要求要来越高,到第三范式的时候,为了达到数据不冗余,已经对我们的数据查询效率有影响了;

    因此,我们一般也只做到第三范式,就不再继续做下去了,比较我们不是只一昧的追求消除数据冗余,有时候,我们更需要查询效率 ;

  • 相关阅读:
    lintcode:落单的数
    lintcode: 翻转链表
    lintcode :Reverse Words in a String 翻转字符串
    lintcode :Invert Binary Tree 翻转二叉树
    lintcode : 空格替换
    lintcode:Matrix Zigzag Traversal 矩阵的之字型遍历
    lintcode: 爬楼梯
    lintcode:Compare Strings 比较字符串
    lintcode: 有效的括号序列
    lintcode :Valid Palindrome 有效回文串
  • 原文地址:https://www.cnblogs.com/young-youth/p/11665639.html
Copyright © 2011-2022 走看看