数据库范式 订阅
设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。 展开全文
设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。
信息
外文名
Database Normalization
相关知识
反范式
作    用
减少数据库中数据冗余的过程
种    类
六种
中文名
数据库标准化
应用领域
计算机
数据库范式范式简介
范式来自英文Normal form,简称NF。要想设计—个好的关系,必须使关系满足一定的约束条件,此约束已经形成了规范,分成几个等级,一级比一级要求得严格。满足这些规范的数据库是简洁的、结构明晰的,同时,不会发生插入(insert)、删除(delete)和更新(update)操作异常。反之则是乱七八糟,不仅给数据库的编程人员制造麻烦,而且面目可憎,可能存储了大量不需要的冗余信息。目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多规范要求的称为第二范式(2NF),其余范式以次类推。一般来说,数据库只需满足第三范式(3NF)就行了。
收起全文
精华内容
下载资源
问答
  • 数据库范式

    2013-09-10 10:37:34
    设计范式范式,数据库设计范式,数据库的设计范式)是符合某一种级别的关系模式的集合。构造数据库必须遵循一定的规则。在关系数据库中,这种规则就是范式。关系数据库中的关系必须满足一定的要求,即满足不同的范式...
  • 写在前面的话:我认为数据库范式是非常充满哲学意味的一种理论,学院派们说:“数据库设计一定要遵循某某范式啊”,实践派说:“一看你没有实际经验”。使用范式还是不使用范式,这是一个问题。一看到“范式”这个词...
  • 详解MySQL 数据库范式

    2021-01-19 21:42:22
    关于数据库范式,时常有听说过,一直没有详细去了解。一般数据库书籍或数据库课程会介绍范式相关内容,范式也经常出现在数据库考试题目中。不清楚你是否对范式有比较清晰的了解呢?本篇文章我们一起来学习下数据库...
  • 数据库范式例题

    千次阅读 多人点赞 2021-04-26 10:38:24
    范式 标准的二维表就满足第一范式(1NF) 满足第一范式且每一个非主属性完全函数依赖任何一个候选码就满足第二范式(2NF) 满足第二范式且不存在传递函数依赖就满足第三范式3NF 满足第三范式且非主属性对候选码没有...

    题目

    一.

    Y(X1,X2,X3,X4)
    (X1,X2) → \rightarrow X3
    X2 → \rightarrow X4
    侯选码?
    属于第几范式?

    二.

    R(A,B,C,D)
    F={AB → \rightarrow D,AC → \rightarrow BD,B → \rightarrow C}
    侯选码?
    最高属于第几范式?

    三.

    R(X,Y,Z,W)
    F={Y ← \leftarrow → \rightarrow W,XY → \rightarrow Z}
    侯选码?
    最高属于第几范式?

    一.

    因为 X2 → \rightarrow X4
    所以 ( X 1 , X 2 ) → P X 4 (X1,X2) \stackrel{P}{\rightarrow} X4 (X1,X2)PX4
    因为 ( X 1 , X 2 ) → X 3 (X1,X2) \stackrel{}{\rightarrow} X3 (X1,X2)X3
    所以 ( X 1 , X 2 ) → ( X 3 , X 4 ) (X1,X2) \stackrel{}{\rightarrow} (X3,X4) (X1,X2)(X3,X4)
    因此:候选码:(X1,X2);非主属性:X3,X4。
    因为(X1,X2) → \rightarrow X4, X2 → \rightarrow X4,存在非主属性X4对候选码(X1,X2)的部分函数依赖;
    所以不属于2NF。
    结论:候选码(X1,X2),属于第一范式。

    二.

    因为 B → \rightarrow C
    所以 ( A , B ) → ( C , D ) (A,B) \stackrel{}{\rightarrow} (C,D) (A,B)(C,D)
    因为 ( A , C ) → ( B , D ) (A,C) \stackrel{}{\rightarrow} (B,D) (A,C)(B,D)
    因此:候选码:(A,B)、(A,C);非主属性:D。
    不存在非主属性D对候选码(A,B)、(A,C)的部分函数依赖;
    所以属于第三范式。
    不属于BCNF 因为B→C,B不包含码
    满足BCNF的关系模式有:

    • 所有非主属性对每一个码都是完全函数依赖
    • 所有主属性对每一个不包含它的码也是完全函数依赖
    • 没有任何属性完全函数依赖于非码的任何一组属性
      第二题因为C并不是完全依赖于不包含C的码,因为B → \rightarrow C。

    因为(X,Y) → \rightarrow Z ,Y → \rightarrow W
    所以(X,Y) → \rightarrow (W,Z),(X,Y)是码
    因为(X,W) → \rightarrow X, (X,W) → \rightarrow W, W → \rightarrow Y
    所以(X,W) → \rightarrow (X,Y,W),
    因为W → \rightarrow Y,XW → \rightarrow XY,XY → \rightarrow Z,所以(X,W) → \rightarrow Z
    所以(X,W)也是码
    候选码:(X,Y)、(X,W);非主属性:Z。
    属于第二范式,因为Z完全依赖于码(非主属性只有Z)
    属于第三范式,因为Z没有传递依赖于码
    不属于BC范式 因为W→Y,决定者不包含候选码
    所以第三题最高属于第三范式。

    展开全文
  • 数据库范式介绍

    2016-10-04 21:59:19
    数据库范式
  • 文章目录数据库范式:容易忽略的关键知识第一范式(1NF)第二范式(2NF)第三范式(3NF)鲍依斯-科得范式(BCNF)参考文章 数据库范式:容易忽略的关键知识 大多数面试的时候,问数据库知识,问得最多得就是索引、事务。...
  • 数据库范式问题

    千次阅读 多人点赞 2018-03-25 16:40:31
    国内绝大多数院校用的王珊的《数据库系统概论》这本教材,某些方面并没有给出很详细很明确的解释,与实际应用联系不那么紧密,你有这样的疑问也是挺正常的。我教《数据库原理》这门课有几年了...

    作者:知乎用户
    链接:https://www.zhihu.com/question/24696366/answer/29189700
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
     

    国内绝大多数院校用的王珊的《数据库系统概论》这本教材,某些方面并没有给出很详细很明确的解释,与实际应用联系不那么紧密,你有这样的疑问也是挺正常的。我教《数据库原理》这门课有几年了,有很多学生提出了和你一样的问题,试着给你解释一下吧。(基本来自于我上课的内容,某些地方为了不过于啰嗦,放弃了一定的严谨,主要是在“关系”和“表”上)

    首先要明白”范式(NF)”是什么意思。按照教材中的定义,范式是“符合某一种级别的关系模式的集合,表示一个关系内部各属性之间的联系的合理化程度”。很晦涩吧?实际上你可以把它粗略地理解为一张数据表的表结构所符合的某种设计标准的级别。就像家里装修买建材,最环保的是E0级,其次是E1级,还有E2级等等。数据库范式也分为1NF,2NF,3NF,BCNF,4NF,5NF。一般在我们设计关系型数据库的时候,最多考虑到BCNF就够。符合高一级范式的设计,必定符合低一级范式,例如符合2NF的关系模式,必定符合1NF。

    接下来就对每一级范式进行一下解释,首先是第一范式(1NF)。

    符合1NF的关系(你可以理解为数据表。“关系模式”和“关系”的区别,类似于面向对象程序设计中”类“与”对象“的区别。”关系“是”关系模式“的一个实例,你可以把”关系”理解为一张带数据的表,而“关系模式”是这张数据表的表结构。1NF的定义为:符合1NF的关系中的每个属性都不可再分。表1所示的情况,就不符合1NF的要求。

    表1

    实际上,1NF是所有关系型数据库的最基本要求,你在关系型数据库管理系统(RDBMS),例如SQL Server,Oracle,MySQL中创建数据表的时候,如果数据表的设计不符合这个最基本的要求,那么操作一定是不能成功的。也就是说,只要在RDBMS中已经存在的数据表,一定是符合1NF的。如果我们要在RDBMS中表现表中的数据,就得设计为表2的形式:

    表2

    但是仅仅符合1NF的设计,仍然会存在数据冗余过大,插入异常,删除异常,修改异常的问题,例如对于表3中的设计:

    表3

    1. 每一名学生的学号、姓名、系名、系主任这些数据重复多次。每个系与对应的系主任的数据也重复多次——数据冗余过大
    2. 假如学校新建了一个系,但是暂时还没有招收任何学生(比如3月份就新建了,但要等到8月份才招生),那么是无法将系名与系主任的数据单独地添加到数据表中去的 (注1)——插入异常

      注1:根据三种关系完整性约束中实体完整性的要求,关系中的码(注2)所包含的任意一个属性都不能为空,所有属性的组合也不能重复。为了满足此要求,图中的表,只能将学号与课名的组合作为码,否则就无法唯一地区分每一条记录。

      注2:码:关系中的某个属性或者某几个属性的组合,用于区分每个元组(可以把“元组”理解为一张表中的每条记录,也就是每一行)
    3. 假如将某个系中所有学生相关的记录都删除,那么所有系与系主任的数据也就随之消失了(一个系所有学生都没有了,并不表示这个系就没有了)。——删除异常
    4. 假如李小明转系到法律系,那么为了保证数据库中数据的一致性,需要修改三条记录中系与系主任的数据。——修改异常

    正因为仅符合1NF的数据库设计存在着这样那样的问题,我们需要提高设计标准,去掉导致上述四种问题的因素,使其符合更高一级的范式(2NF),这就是所谓的“规范化”。

    第二范式(2NF)在关系理论中的严格定义我这里就不多介绍了(因为涉及到的铺垫比较多),只需要了解2NF对1NF进行了哪些改进即可。其改进是,2NF在1NF的基础之上,消除了非主属性对于码的部分函数依赖。接下来对这句话中涉及到的四个概念——“函数依赖”“码”“非主属性”、与“部分函数依赖”进行一下解释。

    函数依赖
    我们可以这么理解(但并不是特别严格的定义):若在一张表中,在属性(或属性组)X的值确定的情况下,必定能确定属性Y的值,那么就可以说Y函数依赖于X,写作 X → Y。也就是说,在数据表中,不存在任意两条记录,它们在X属性(或属性组)上的值相同,而在Y属性上的值不同。这也就是“函数依赖”名字的由来,类似于函数关系 y = f(x),在x的值确定的情况下,y的值一定是确定的。

    例如,对于表3中的数据,找不到任何一条记录,它们的学号相同而对应的姓名不同。所以我们可以说姓名函数依赖于学号,写作 学号 → 姓名。但是反过来,因为可能出现同名的学生,所以有可能不同的两条学生记录,它们在姓名上的值相同,但对应的学号不同,所以我们不能说学号函数依赖于姓名。表中其他的函数依赖关系还有如:

    • 系名 → 系主任
    • 学号 → 系主任
    • (学号,课名) → 分数

    但以下函数依赖关系则不成立:

    • 学号 → 课名
    • 学号 → 分数
    • 课名 → 系主任
    • (学号,课名) → 姓名

    从“函数依赖”这个概念展开,还会有三个概念:

    完全函数依赖

    在一张表中,若 X → Y,且对于 X 的任何一个真子集(假如属性组 X 包含超过一个属性的话),X ' → Y 不成立,那么我们称 Y 对于 X 完全函数依赖,记作 X F→ Y。(那个F应该写在箭头的正上方,没办法打出来……,正确的写法如图1

    <img src="https://pic1.zhimg.com/50/12513de20079d12b99d946072df7311a_hd.jpg" data-caption="" data-rawwidth="98" data-rawheight="53" class="content_image" width="98">

    图1

    例如:

    • 学号 F→ 姓名
    • (学号,课名) F→ 分数 (注:因为同一个的学号对应的分数不确定,同一个课名对应的分数也不确定)

    部分函数依赖

    假如 Y 函数依赖于 X,但同时 Y 并不完全函数依赖于 X,那么我们就称 Y 部分函数依赖于 X,记作 X P→ Y,如图2

    图2

     

    例如:

    • (学号,课名) P→ 姓名

     

    传递函数依赖
    假如 Z 函数依赖于 Y,且 Y 函数依赖于 X (感谢

    @百达

    指出的错误,这里改为:『Y 不包含于 X,且 X 不函数依赖于 Y』这个前提),那么我们就称 Z 传递函数依赖于 X ,记作 X T→ Z,如图3

    图3


    设 K 为某表中的一个属性或属性组,若除 K 之外的所有属性都完全函数依赖于 K(这个“完全”不要漏了),那么我们称 K 为候选码,简称为。在实际中我们通常可以理解为:假如当 K 确定的情况下,该表除 K 之外的所有属性的值也就随之确定,那么 K 就是码。一张表中可以有超过一个码。(实际应用中为了方便,通常选择其中的一个码作为主码

    例如:
    对于表3,(学号、课名)这个属性组就是码。该表中有且仅有这一个码。(假设所有课没有重名的情况)

    非主属性
    包含在任何一个码中的属性成为主属性。

    例如:
    对于表3,主属性就有两个,学号课名

     

    终于可以回过来看2NF了。首先,我们需要判断,表3是否符合2NF的要求?根据2NF的定义,判断的依据实际上就是看数据表中是否存在非主属性对于码的部分函数依赖。若存在,则数据表最高只符合1NF的要求,若不存在,则符合2NF的要求。判断的方法是:

    第一步:找出数据表中所有的
    第二步:根据第一步所得到的码,找出所有的主属性
    第三步:数据表中,除去所有的主属性,剩下的就都是非主属性了。
    第四步:查看是否存在非主属性对码的部分函数依赖

    对于表3,根据前面所说的四步,我们可以这么做:

    第一步:

    1. 查看所有每一单个属性,当它的值确定了,是否剩下的所有属性值都能确定。
    2. 查看所有包含有两个属性的属性组,当它的值确定了,是否剩下的所有属性值都能确定。
    3. ……
    4. 查看所有包含了六个属性,也就是所有属性的属性组,当它的值确定了,是否剩下的所有属性值都能确定。

    看起来很麻烦是吧,但是这里有一个诀窍,就是假如A是码,那么所有包含了A的属性组,如(A,B)、(A,C)、(A,B,C)等等,都不是码了(因为作为码的要求里有一个“完全函数依赖”)。

    图4表示了表中所有的函数依赖关系:

    <img src="https://pic1.zhimg.com/50/51e2689ac9416a91800e63101bee9db7_hd.jpg" data-caption="" data-rawwidth="541" data-rawheight="212" class="origin_image zh-lightbox-thumb" width="541" data-original="https://pic1.zhimg.com/51e2689ac9416a91800e63101bee9db7_r.jpg">

    图4

    这一步完成以后,可以得到,表3的码只有一个,就是(学号、课名)

    第二步:
    主属性有两个:学号 课名

     

    第三步:
    非主属性有四个:姓名系名系主任分数

     

    第四步:
    对于(学号,课名) → 姓名,有 学号 → 姓名,存在非主属性 姓名 对码(学号,课名)的部分函数依赖。
    对于(学号,课名) → 系名,有 学号 → 系名,存在非主属性 系对码(学号,课名)的部分函数依赖。
    对于(学号,课名) → 系主任,有 学号 → 系主任,存在非主属性 对码(学号,课名)的部分函数依赖。

    所以表3存在非主属性对于码的部分函数依赖,最高只符合1NF的要求,不符合2NF的要求。

     

     

    为了让表3符合2NF的要求,我们必须消除这些部分函数依赖,只有一个办法,就是将大数据表拆分成两个或者更多个更小的数据表,在拆分的过程中,要达到更高一级范式的要求,这个过程叫做”模式分解“。模式分解的方法不是唯一的,以下是其中一种方法:
    选课(学号,课名,分数)
    学生(学号,姓名,系名,系主任)

    我们先来判断以下,选课表与学生表,是否符合了2NF的要求?

    对于选课表,其码是(学号,课名),主属性是学号课名,非主属性是分数学号确定,并不能唯一确定分数课名确定,也不能唯一确定分数,所以不存在非主属性分数对于码 (学号,课名)的部分函数依赖,所以此表符合2NF的要求。

    对于学生表,其码是学号,主属性是学号,非主属性是姓名、系名系主任,因为码只有一个属性,所以不可能存在非主属性对于码 的部分函数依赖,所以此表符合2NF的要求。

    图5表示了模式分解以后的新的函数依赖关系

    图5

    表4表示了模式分解以后新的数据

    <img src="https://pic4.zhimg.com/50/44af74509a4e21372ed372be8560539d_hd.jpg" data-caption="" data-rawwidth="478" data-rawheight="314" class="origin_image zh-lightbox-thumb" width="478" data-original="https://pic4.zhimg.com/44af74509a4e21372ed372be8560539d_r.jpg">

     

    表4

    (这里还涉及到一个如何进行模式分解才是正确的知识点,先不介绍了)

    现在我们来看一下,进行同样的操作,是否还存在着之前的那些问题?

    1. 李小明转系到法律系
      只需要修改一次李小明对应的系的值即可。——有改进
    2. 数据冗余是否减少了?
      学生的姓名、系名与系主任,不再像之前一样重复那么多次了。——有改进
    3. 删除某个系中所有的学生记录
      该系的信息仍然全部丢失。——无改进
    4. 插入一个尚无学生的新系的信息。
      因为学生表的码是学号,不能为空,所以此操作不被允许。——无改进

    所以说,仅仅符合2NF的要求,很多情况下还是不够的,而出现问题的原因,在于仍然存在非主属性系主任对于码学号的传递函数依赖。为了能进一步解决这些问题,我们还需要将符合2NF要求的数据表改进为符合3NF的要求。

    第三范式(3NF) 3NF在2NF的基础之上,消除了非主属性对于码的传递函数依赖。也就是说, 如果存在非主属性对于码的传递函数依赖,则不符合3NF的要求。

    接下来我们看看表4中的设计,是否符合3NF的要求。

    对于选课表,主码为(学号,课名),主属性为学号课名,非主属性只有一个,为分数,不可能存在传递函数依赖,所以选课表的设计,符合3NF的要求。

    对于学生表,主码为学号,主属性为学号,非主属性为姓名系名系主任。因为 学号 → 系名,同时 系名 → 系主任,所以存在非主属性系主任对于码学号的传递函数依赖,所以学生表的设计,不符合3NF的要求。。

    为了让数据表设计达到3NF,我们必须进一步进行模式分解为以下形式:
    选课(学号,课名,分数)
    学生(学号,姓名,系名)
    系(系名,系主任)

    对于选课表,符合3NF的要求,之前已经分析过了。

    对于学生表,码为学号,主属性为学号,非主属性为系名,不可能存在非主属性对于码的传递函数依赖,所以符合3NF的要求。

    对于表,码为系名,主属性为系名,非主属性为系主任,不可能存在非主属性对于码的传递函数依赖(至少要有三个属性才可能存在传递函数依赖关系),所以符合3NF的要求。。

     

    新的函数依赖关系如图6

    图6

    新的数据表如表5

     

    表5

     

    现在我们来看一下,进行同样的操作,是否还存在着之前的那些问题?

    1. 删除某个系中所有的学生记录
      该系的信息不会丢失。——有改进
    2. 插入一个尚无学生的新系的信息。
      因为系表与学生表目前是独立的两张表,所以不影响。——有改进
    3. 数据冗余更加少了。——有改进

     

    结论
    由此可见,符合3NF要求的数据库设计,基本上解决了数据冗余过大,插入异常,修改异常,删除异常的问题。当然,在实际中,往往为了性能上或者应对扩展的需要,经常 做到2NF或者1NF,但是作为数据库设计人员,至少应该知道,3NF的要求是怎样的。

    ==============时隔半年,终于决定把这个坑填上,来晚了 ===========

    BCNF范式

    要了解 BCNF 范式,那么先看这样一个问题:

    若:

    1. 某公司有若干个仓库;
    2. 每个仓库只能有一名管理员,一名管理员只能在一个仓库中工作;
    3. 一个仓库中可以存放多种物品,一种物品也可以存放在不同的仓库中。每种物品在每个仓库中都有对应的数量。

    那么关系模式 仓库(仓库名,管理员,物品名,数量) 属于哪一级范式?

    答:已知函数依赖集:仓库名 → 管理员,管理员 → 仓库名,(仓库名,物品名)→ 数量
    码:(管理员,物品名),(仓库名,物品名)
    主属性:仓库名、管理员、物品名
    非主属性:数量
    ∵ 不存在非主属性对码的部分函数依赖和传递函数依赖。∴ 此关系模式属于3NF。

    基于此关系模式的关系(具体的数据)可能如图所示:

    <img src="https://pic4.zhimg.com/50/68d080d437732aad8cfe451b427849d6_hd.jpg" data-caption="" data-rawwidth="625" data-rawheight="296" class="origin_image zh-lightbox-thumb" width="625" data-original="https://pic4.zhimg.com/68d080d437732aad8cfe451b427849d6_r.jpg">

     

     

    好,既然此关系模式已经属于了 3NF,那么这个关系模式是否存在问题呢?我们来看以下几种操作:

    1. 先新增加一个仓库,但尚未存放任何物品,是否可以为该仓库指派管理员?——不可以,因为物品名也是主属性,根据实体完整性的要求,主属性不能为空。
    2. 某仓库被清空后,需要删除所有与这个仓库相关的物品存放记录,会带来什么问题?——仓库本身与管理员的信息也被随之删除了。
    3. 如果某仓库更换了管理员,会带来什么问题?——这个仓库有几条物品存放记录,就要修改多少次管理员信息。

    从这里我们可以得出结论,在某些特殊情况下,即使关系模式符合 3NF 的要求,仍然存在着插入异常,修改异常与删除异常的问题,仍然不是 ”好“ 的设计。

    造成此问题的原因:存在着主属性对于码的部分函数依赖与传递函数依赖。(在此例中就是存在主属性【仓库名】对于码【(管理员,物品名)】的部分函数依赖。

    解决办法就是要在 3NF 的基础上消除主属性对于码的部分与传递函数依赖。

    仓库(仓库名,管理员)
    库存(仓库名,物品名,数量)

    这样,之前的插入异常,修改异常与删除异常的问题就被解决了。

    以上就是关于 BCNF 的解释。

     

    最近身体不太舒服,写不动了。有空再放几个典型习题及其解答吧。
    ===============================
    问题1:

    李德竹 :老师您好,我看了您关于数据库范式的回答,有一点不太理解,就是关于码的定义,如果除K之外的所有属性都完全函数依赖于K时才能称K为码,那么在判断2NF时又怎么会存在非主属性对码的部分函数依赖这种情况?希望老师有时间能指点一下,谢谢

    我 :在“码”的定义中,除 K 之外的所有属性应该看成是一个集合 U(也就是一个整体),也就是说,只有 K 能够完全函数决定 U 中的每一个属性,那么 K 才是码。如果 K 只是能够完全函数决定 U 中的一部分属性,而不能完全函数决定另外一部分属性,那么 K 不是码。

    比如有关系模式 R (Sno, Sname, Cno, Cname, Sdept, Sloc, Grade),其中函数依赖集为 F= {
    Sno → Sname, Sno → Sdept, Sdept → Sloc,Sno → Sloc, Cno → Cname, (Sno, Cno) → Grade }

    那么 R 中的码只能是 (Sno, Cno),Sno 或 Cno 并不能完全函数决定除 Sno / Cno 之外的所有其他属性(其实就是不能决定 Grade ),所以单独的 Sno 与 Cno 并不能作为码。

    所以可得到主属性:Sno, Cno
    非主属性:Sname, Cname, Sdept, Sloc, Grade

    R 中存在非主属性 Cname 对于码 (Sno, Cno) 的部分函数依赖 (Cno → Cname) 。(还有很多别的例子就不一一列举了)。所以 R 不符合 2NF 的要求。

    ========================================

    花了好几天断断续续写了这个答案,累死我了。看有不少人对此有疑问,干脆写一个详细点的,希望成为这个知识点的权威回答……如果有一些细节方面的问题,比如表达上,还会进行修改,大的方面,肯定是没错的。

    展开全文
  • 一、数据库范式  为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则称为范式。范式是符合某一种设计要求的总结。要想设计一个结构合理的关系型数据库,必须满足一定...
  • 数据库范式详解+实例

    2010-12-29 19:33:15
    范式和函数依赖的详细解释,再加上了一些实例
  • 数据库范式概念以及范式分解详解

    千次阅读 2021-01-03 15:50:49
    整个属性组是码,称为全码(All-key) 范式 第一范式 每个属性不可分割 第二范式 若关系模式R∈1NF,并且每一个非主属性都完全函数依赖于任何一个候选码,则R∈2NF 第三范式 消除非主属性对于码的传递依赖 若R中不...
    1. 几个重要知识点

      • 平凡函数依赖与非平凡函数依赖

        • X→Y,但Y⊈X则称X→Y是非平凡的函数依赖。
        • X→Y,但Y⊆X 则称X→Y是平凡的函数依赖。
      • 完全函数依赖与部分函数依赖

        在R(U)中,

        • 如果X→Y,并且对于X的任何一个真子集X’, 都有 X’ ↛ Y, 则称Y对X完全函数依赖,记作X → Y。
        • 若X→Y,但Y不完全函数依赖于X,则称Y对X部分函数依赖,记作X → Y
      • 候选码

        设K为R<U,F>中的属性或属性组合。若K → U,则K称为R的一个候选码(Candidate Key)。

        千万需要记住的是候选码与超码之间的区别

      • 超码

        如果U部分函数依赖于K,即K → U,则K称为超码(Surpkey)。

        候选码是最小的超码,即K的任意一个真子集都不是候选码。

      • 主码

        主码是候选码中的任意一个

      • 主属性与非主属性

        • 包含在任何一个候选码中的属性 ,称为主属性(Prime attribute)
        • 不包含在任何码中的属性称为非主属性(Nonprime attribute)或非码属性(Non-key attribute)
      • 全码

        整个属性组是码,称为全码(All-key)

    2. 范式

      • 第一范式

        每个属性不可分割

      • 第二范式

        若关系模式R∈1NF,并且每一个非主属性完全函数依赖于任何一个候选码,则R∈2NF

      • 第三范式

        消除非主属性对于码的传递依赖
        若R中不存在这样的码X、属性组Y及非主属性Z(Z ⊇ Y), 使得X→Y,Y→Z成立,Y ↛ X不成立,则称R<U,F> ∈ 3NF。

        三范式分解

      • BC范式

        消除主属性对码的部分和传递函数依赖

        判断:在关系模式R<U,F>中,如果每一个决定属性集都包含候选码,则R∈BCNF。

      1. 无损连接与保持函数依赖性

        • 无损连接

      在这里插入图片描述

      无损连接判断

      • 保持函数依赖性

      在这里插入图片描述

      一个无损连接的分解不一定具有依赖保持性,反之亦然 !

      1. 三范式分解(范式分解最终的答案并非是唯一的,和分解的顺序有关!)

        • 三范式分解为保持函数依赖的分解

          步骤如下:

        在这里插入图片描述

        例题:

        设R<U, F>,其中:
        U={C, T, H, R, S, G, X, Y, Z},
        F={C→T, CS→G, HR→C,HS→ R, TH→ R, C→X},

        ​ 将R 分解为3NF,且保持函数依赖。

        解:

        1. 求F的最小函数依赖集

          该函数依赖集已经是最小化的

          1. 查看是否有一个函数依赖X->A,且XA=R。

          可以很清楚的看到,并没有这种函数依赖。

        2. 查看R中的某些属性是否并不在F中出现过

          可以很清楚的看到有YZ

        3. 将最小函数依赖集中的每一个依赖左右两边放到一起

          则分解为ρ ={YZ, CTX, CSG, HRC, HSR, THR}
          注:这里的CTX放到一起时因为C → \rightarrow T,C → \rightarrow X

        • 三范式分解既具有无损连接性又能保持函数依赖的分解

          非常简单!在原来的基础上加上候选码中的任意一个即可。

          例如此题中的候选码为HS

          那么在原来的ρ中添加HS即可,但是此处需要注意

          ∵ HS⊆ HSR
          ∴ τ= ρ ={CTX, CSG, HRC, HSR, THR, YZ}为满足要求的分解

      2. BCNF分解(范式分解最终的答案并非是唯一的,和分解的顺序有关!)

        • 如何判定BCNF范式呢?

          很简单!就是看每个函数依赖的左边是否包含候选码,如果其中有一个不含候选码,则不为BCNF范式。

        • 将关系模式转换为BCNF 的无损连接的分解

          ​ 递归下去,直到出现 Φ \Phi Φ或者出现最终的一个依赖符合BCNF约束则停止分解

          ​ 例子1:
          ​ 已知 R (A, B, C), AB为码, 且B->C存在
          ​ 可知:R不满足BCNF
          ​ 设 α \alpha α = B, β \beta β = C
          ​ 则 R 可分解为:
          ​ ( α \alpha α ⋃ \bigcup β \beta β) = (B, C)
          ​ (R – ( β \beta β − - α \alpha α)) = (A, B)

          ​ 例子2:
          在这里插入图片描述

    展开全文
  • [数据库] 理解数据库范式-通俗易懂 转自:http://blog.chinaunix.net/uid-10073362-id-225057.html  数据库范式是数据库设计中必不可少的知识,没有对范式的理解,就无法设计出高效率、优雅的数据库。甚至设计出...

    [数据库] 理解数据库范式-通俗易懂

    转自:http://blog.chinaunix.net/uid-10073362-id-225057.html

      数据库范式是数据库设计中必不可少的知识,没有对范式的理解,就无法设计出高效率、优雅的数据库。甚至设计出错误的数据库。而想要理解并掌握范式却并不是那么容易。教科书中一般以关系代数的方法来解释数据库范式。这样做虽然能够十分准确的表达数据库范式,但比较抽象,不太直观,不便于理解,更难以记忆。
      本文用较为直白的语言介绍范式,旨在便于理解和记忆,这样做可能会出现一些不精确的表述。但对于初学者应该是个不错的入门。我写下这些的目的主要是为了加强记忆,其实我也比较菜,我希望当我对一些概念生疏的时候,回过头来看看自己写的笔记,可以快速地进入状态。如果你发现其中用错误,请指正。
    下面开始进入正题:

    一、基础概念
      要理解范式,首先必须对知道什么是关系数据库,如果你不知道,我可以简单的不能再简单的说一下:关系数据库就是用二维表来保存数据。表和表之间可以……(省略10W字)。

    然后你应该理解以下概念:

    实体:现实世界中客观存在并可以被区别的事物。比如“一个学生”、“一本书”、“一门课”等等。值得强调的是这里所说的“事物”不仅仅是看得见摸得着的“东西”,它也可以是虚拟的,比如说“老师与学校的关系”。

    属性:教科书上解释为:“实体所具有的某一特性”,由此可见,属性一开始是个逻辑概念,比如说,“性别”是“人”的一个属性。在关系数据库中,属性又是个物理概念,属性可以看作是“表的一列”

    元组:表中的一行就是一个元组

    分量:元组的某个属性值。在一个关系数据库中,它是一个操作原子,即关系数据库在做任何操作的时候,属性是“不可分的”。否则就不是关系数据库了。

    码:表中可以唯一确定一个元组的某个属性(或者属性组),如果这样的码有不止一个,那么大家都叫候选码,我们从候选码中挑一个出来做老大,它就叫主码

    全码:如果一个码包含了所有的属性,这个码就是全码。

    主属性:一个属性只要在任何一个候选码中出现过,这个属性就是主属性。

    非主属性:与上面相反,没有在任何候选码中出现过,这个属性就是非主属性。

    外码:一个属性(或属性组),它不是码,但是它别的表的码,它就是外码。

    二、6个范式
    好了,上面已经介绍了我们掌握范式所需要的全部基础概念,下面我们就来讲范式。首先要明白,范式的包含关系。一个数据库设计如果符合第二范式,一定也符合第一范式。如果符合第三范式,一定也符合第二范式……

     

    ·第一范式(1NF):属性不可分。

    在前面已经介绍了属性值的概念,我们说,它是“不可分的”。而第一范式要求属性也不可分。那么它和属性值不可分有什么区别呢?给一个例子:

    这个表中,属性值“分”了。“电话”这个属性里对于“小明”属性值分成了两个。

    这两种情况都不满足第一范式。不满足第一范式的数据库,不是关系数据库!所以,我们在任何关系数据库管理系统中,做不出这样的“表”来。针对上述情况可以做成这样的表:这个表中,属性 “分”了。也就是“电话”分为了“手机”和“座机”两个属性。

     

    ·第二范式(2NF):符合1NF,并且,非主属性完全依赖于码。(注意是完全依赖不能是部分依赖,设有函数依赖W→A,若存在XW,有X→A成立,那么称W→A是局部依赖,否则就称W→A是完全函数依赖)

    一个学生上一门课,一定是特定某个老师教。所以有(学生,课程)->老师;

    一个学生上一门课,一定在特定某个教室。所以有(学生,课程)->教室;

    一个学生上一门课,他老师的职称可以确定。所以有(学生,课程)->老师职称;

    一个学生上一门课,一定是特定某个教材。所以有(学生,课程)->教材

    一个学生上一门课,一定在特定时间。所以有(学生,课程)->上课时间

    因此(学生,课程)是一个码。

    然而,一个课程,一定指定了某个教材,一年级语文肯定用的是《小学语文1》,那么就有课程->教材。(学生,课程)是个码,课程却决定了教材,这就叫做不完全依赖,或者说部分依赖。出现这样的情况,就不满足第二范式!

    有什么不好吗?你可以想想:

    1、校长要新增加一门课程叫“微积分”,教材是《大学数学》,怎么办?学生还没选课,而学生又是主属性,主属性不能空,课程怎么记录呢,教材记到哪呢? ……郁闷了吧?(插入异常)

    2、下学期没学生学一年级语文(上)了,学一年级语文(下)去了,那么表中将不存在一年级语文(上),也就没了《小学语文1》。这时候,校长问:一年级语文(上)用的什么教材啊?……郁闷了吧?(删除异常)

    3、校长说:一年级语文(上)换教材,换成《大学语文》。有10000个学生选了这门课,改动好大啊!改累死了……郁闷了吧?(修改/更新异常,在这里你可能觉得直接把教材《小学语文1》替换成《大学语文》不就可以了,但是替换操作虽然计算机运行速度很快,但是毕竟也要替换10000次,造成了很大的时间开销)

    那应该怎么解决呢?投影分解,将一个表分解成两个或若干个表

     

    ·第三范式(3NF):符合2NF,并且,消除传递依赖(也就是每个非主属性都不传递依赖于候选键,判断传递函数依赖,指的是如果存在"A → B → C"的决定关系,则C传递函数依赖于A。)

    上面的“学生上课新表”符合2NF,但是它有传递依赖!在哪呢?问题就出在“老师”和“老师职称”这里。一个老师一定能确定一个老师职称。(学生,课程)->老师->职称。

    有什么问题吗?想想:

    1、老师升级了,变教授了,要改数据库,表中有N条,改了N次……(修改异常)
    2、没人选这个老师的课了,老师的职称也没了记录……(删除异常)
    3、新来一个老师,还没分配教什么课,他的职称记到哪?……(插入异常)
    那应该怎么解决呢?和上面一样,投影分解:

     

    ·BC范式(BCNF):符合3NF,并且,主属性不依赖于主属性(也就是不存在任何字段对任一候选关键字段的传递函数依赖)

    BC范式既检查非主属性,又检查主属性。当只检查非主属性时,就成了第三范式。满足BC范式的关系都必然满足第三范式。

    还可以这么说:若一个关系达到了第三范式,并且它只有一个候选码,或者它的每个候选码都是单属性,则该关系自然达到BC范式。

    给你举个例子:假设仓库管理关系表 (仓库ID, 存储物品ID, 管理员ID, 数量),且有一个管理员只在一个仓库工作;一个仓库可以存储多种物品。

    这个数据库表中存在如下决定关系:

    (仓库ID, 存储物品ID) →(管理员ID, 数量)

    (管理员ID, 存储物品ID) → (仓库ID, 数量)

    所以,(仓库ID, 存储物品ID)和(管理员ID, 存储物品ID)都是StorehouseManage的候选关键字,表中的唯一非关键字段为数量,它是符合第三范式的。但是,由于存在如下决定关系:

    (仓库ID) → (管理员ID)

    (管理员ID) → (仓库ID)

    即存在关键字段决定关键字段的情况,所以其不符合BCNF范式。它会出现如下异常情况:

    (1) 删除异常:

    当仓库被清空后,所有"存储物品ID"和"数量"信息被删除的同时,"仓库ID"和"管理员ID"信息也被删除了。

    (2) 插入异常:

    当仓库没有存储任何物品时,无法给仓库分配管理员。

    (3) 更新异常:

    如果仓库换了管理员,则表中所有行的管理员ID都要修改。

    把仓库管理关系表分解为二个关系表:

    仓库管理:StorehouseManage(仓库ID, 管理员ID);

    仓库:Storehouse(仓库ID, 存储物品ID, 数量)。

    这样的数据库表是符合BCNF范式的,消除了删除异常、插入异常和更新异常。

    一般,一个数据库设计符合3NF或BCNF就可以了。在BC范式以上还有第四范式、第五范式。

    ·第四范式:要求把同一表内的多对多关系删除。

    ·第五范式:从最终结构重新建立原始结构。

    其实数据库设计范式这方面重点掌握的就是1NF、2NF、3NF、BCNF

     

    四种范式之间存在如下关系:

    这里主要区别3NF和BCNF,一句话就是3NF是要满足不存在非主属性对候选码的传递函数依赖,BCNF是要满足不存在任一属性(包含非主属性和主属性)对候选码的传递函数依赖

    只能是主属性决定非主属性 所有能决定其他属性的属性都得设计成主属性

    展开全文
  • 第一范式、第二范式、第三范式 参考了https://www.zhihu.com/question/24696366 https://www.cnblogs.com/lca1826/p/6601395.html 基础知识 实体:现实世界中客观存在并可以被区别的事物。...
  • 数据库范式的经典例题,what are you 弄啥嘞?

    千次阅读 多人点赞 2020-04-14 00:19:23
    设关系模式R属于第一范式,若在R中消除了部分函数依赖,则R至少属于( )。 解析:第二范式是完全依赖,消除了部分依赖。 若在R中消除了部分函数依赖,则至少属于第二范式。 设关系模式R{A,B,C,D,E},其上函数依赖集...
  • 数据库范式理论

    2014-09-19 11:10:46
    数据库系统概论数据库范式理论。数据库范式理论
  • 数据库范式判断及分解技巧

    万次阅读 多人点赞 2019-01-12 20:44:11
    数据库中的范式是考试中必考的重点,也是应用中比较实用的操作标准。不说废话了,下面将分段来从不同深度开始说。 【前驱知识补充】 函数依赖 简单通俗地说就是属性之间是否有确定的关系,比如:学生表(学号,姓名...
  • 数据库范式5nfFourth normal form (4NF) is a normal form used in database normalization, in which there are no non-trivial multivalued dependencies except a candidate key. After Boyce–Codd normal form ...
  • 数据库范式是数据库设计中必不可少的知识,没有对范式的理解,就无法设计出高效率、优雅的数据库。甚至设计出错误的数据库。而想要理解并掌握范式却并不是那 么容易。教科书中一般以关系代数的方法来解释数据库范式...
  • 1NF范式 属性列是不可拆的(原子的) 2NF范式 非主属性完全依赖于候选码 3NF范式 在2NF的基础上不存在非主属性传递依赖于候选码(所有非主属性直接依赖于候选码) BCNF范式 所有依赖的左边都包含候选码 ...
  • 这里是修真院后端小课堂,每篇分享文从 ...【什么是数据库范式,是否应该严格遵守范式,什么情况下应该不遵守范式? 】 【修真院java 小课堂】什么是数据库范式,是否应该严格遵守范式,什么情况下应该...
  • 数据库范式——通俗易懂【转】

    千次阅读 多人点赞 2017-01-24 15:19:51
    数据库范式——通俗易懂【转】 (2012-04-02 21:15:43) 标签:    数据库范式是数据库设计中必不可少的知识,没有对范式的理解,就无法设计出高效率、优雅的数据库。甚至设计出错误的数据库。...
  • 9316讲授数据库范式.

    2021-02-18 19:40:55
    9316讲授数据库范式.
  • a、数据库设计的第一大范式数据库表中的所有字段都只具有单一属性;单一属性的列是由基本数据类型所构成的;设计出来的表都是简单的二维表。(一个列存放的信息只是一个属性的信息,不能一个字段存放多个属性的...
  • 什么是数据库规范化 ...数据库范式是埃德加·科德设计出来的。在1970年代初,他定义了第一范式(First normal form)、第二范式(Second normal form),和**第三范式(Third normal form)**的概念。数...
  • 数据库范式区分

    2017-11-01 16:37:39
    最近刷题总是遇到范式问题,...不解释了,就是对应了数据库表的一列,不可分。 2、第二范式  (1)在1NF的基础上:任一非主键列 必须 完全依赖于 主键列(X1,X2....)  (2)不允许出现有:非主键列 部分依赖于
  • 简单说明:BC表示BC范式(BCNF) 对号:符合设计范式的依赖 差号:不符合范式的依赖(附近的文章表示不符合的范式) 主:主属性 非:非主属性 码:主码(外面是主属性表外码的属性) 如对概念不清楚请看 ...
  • 终于等到这一天,我要开始重新系统学习数据库了,关于数据库这块,不出意外的话,每天会定时更新一篇且内容不会包含太多,简短的内容,深入的理解。 SQL语句类别 SQL语句包括以下三个类别 (1)数据定义语言(Data ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 78,490
精华内容 31,396
关键字:

数据库范式