zoukankan      html  css  js  c++  java
  • BCNF/3NF 数据库设计范式简介

    数据库设计有1NF、2NF、3NF、BCNF、4NF、5NF。从左往右,越后面的数据库设计范式冗余度越低。

    满足后一个设计范式也必定满足前一个设计范式。

    1NF只要求每个属性是不可再分的,基本每个数据库都会满足。

    2NF要求每个联系都满足完全依赖,不能存在部分决定(partial dependency)。

    例如,某关系R有6个属性:ABCDEG,满足的函数依赖(functional dependency)为:

    F = {A->B, B->C, AD->G, D->E}

    可以看出,其主键(Primary Key)为{A,D}

    由于函数依赖A->B, B->C, D->E的左边不是完整的AD, 故它违背了完全依赖的要求,没有达到2NF的设计要求

    3NF与BCNF很接近,设计要求比BCNF略微宽松,故先来探讨BCNF

    BCNF的口号是:对每个函数依赖(FD),左边都要是超码(Superkey),

    其具体定义为:

    如果As->Bs是R中一个非平凡的函数依赖,那么As是R的一个超码。

    其中,非平凡是指:Bs不是As的子集

    3NF比BCNF要求宽松一点,即:

    如果As->Bs是R中一个非平凡的函数依赖,那么As是R的一个超码, 或者Bs是主键(Primary Key)的一部分。

    一般而言,数据库设计达到BCNF/3NF,就已经足够了。

    选择达到3NF或者BCNF往往是一个权衡的过程,3NF存在冗余,但能够避免FD的丢失;

    BCNF冗余更低,但可能造成FD的丢失。其中FD的丢失指将新得到的表合并后,会比原来的表多出来一些本来不存在的信息。

  • 相关阅读:
    VS Code 编译运行C/C++
    滴水逆向-文件读写&内存分配-PE准备阶段
    技术从业者的未来(三)
    房价预测-California House Prices
    记录一下Linux的文件夹的rwx权限使用。
    对微任务和宏任务的执行顺序的个人理解
    算法1.4 节 ----- 算法分析
    .NetCore中间件实现原理
    谷歌浏览器禁用JS步骤
    管理经验分享
  • 原文地址:https://www.cnblogs.com/instant7/p/4080529.html
Copyright © 2011-2022 走看看