精华内容
下载资源
问答
  • 多值依赖

    千次阅读 2015-05-31 23:25:06
    多值依赖:  比如:学校中某一门课程由个教员讲授,他们使用相同的一套参考书。每个教员可以讲授门课程,每参考书可以供门课程使用。我们可以用个非规范化的关系来表示教员T,课程C和参考书B之间的关系...
    多值依赖:
     
    

       比如:学校中某一门课程由多个教员讲授,他们使用相同的一套参考书。每个教员可以讲授多门课程,每种参考书可以供多门课程使用。我们可以用一个非规范化的关系来表示教员T,课程C和参考书B之间的关系:

     

    课程C 教员T 参考书B
    ------------------------------
    物理 李 勇 普通物理学
     
    王 军 光学原理
     
    物理习题集
     
    ------------------------------
    数学 李 勇 数学分析
     
    张 平 微分方程
     
    高等代数
     
    把其变成一个表格:

     


    Teaching


    课程C 教员T 参考书B
    ------------------------
    物 理 李 勇 普通物理学
    物 理 李 勇 光学原理
    物 理 李 勇 物理习题集
    物 理 王 军 普通物理学
    物 理 王 军 光学原理
    物 理 王 军 物理习题集
    数 学 李 勇 数学分析
    数 学 李 勇 微分方程
    数 学 李 勇 高等代数
    数 学 张 平 数学分析
    数 学 张 平 微分方程
    数 学 张 平 高等代数
    . . .
    . . .
    . . .

       关系模型TEACHING(C,T,B)的码是(C,T,B),即A1l_Key。因而TEACHING∈BCNF。但是当某一课程(如物理)增加一名讲课教员(如周英)时,必须插人多个元组: (物理,周英,普通物理学),(物理,周英,光学原理),(物理,周英,物理习题集)

       对数据的增删改很不方便, 数据的冗余也十分明显。仔细考察这类关系模式,发现它具有一种称之为多值依赖(MVD)的数据依赖。

     

       定义5.9 设R(U)是属性集U上的一个关系模式。X,Y,Z是的U的子集,并且Z=U-X-Y。关系模式R(U)中多值依赖X→→Y成立,当且仅当对R(U)的任一关系r,给定的一对(x,z)值有一组Y的值,这组值仅仅决定于x值而与z值无关。

       也就是说,一个实体中的A属性的数据不变,而对应的B属性却又很多不同的数据,而这个跟是实体中的C属性没有联系。

       例如,在关系模式TEACHING中,对于一个(物理,光学原理)有一组T值{李勇,王军},这组值仅仅决定于课程C上的值(物理)。也就是说对于另一个(物理,普通物理学)它对应的一组T值仍是{李勇,王军},尽管这时参考书B的值已经改变了。因此T多值依赖于C,即C→→T。

    若X→→Y,而Z = 即Z为空,则称X→→Y 为平凡的多值依赖。

    多值依赖具有以下性质:

    1. 多值依赖具有对称性。即若X→→Y,则X→→Z,其中Z=U-X-Y。
    2. 多值依赖的传递性。即若X→→Y,Y→→Z, 则X→→Z-Y。
    3. 函数依赖可以看作是多值依赖的特殊情况。即若X→Y,则X→→Y。这是因为当X→Y时,对X的每一个值x,Y有一个确定的值y与之对应,所以X→→Y。
    4. 若X→→Y,X→→Z,则X→→YZ。
    5. 若X→→Y,X→→Z,则X→→Y∩Z。
    6. 若X→→Y,X→→Z,则X→→Y-Z,X→→Z-Y。

    多值依赖与函数依赖相比,具有下面两个基本的区别:

    1. 多值依赖的有效性与属性集的范围有关。
      若X→→Y在U上成立则在W(XY W U)上一定成立;反之则不然,即X→→Y在W(W U)上成立,在U上并不一定成立。这是因为多值依赖的定义中不仅涉及属性组X和Y,而且涉及U中其余属性Z。
      一般地,在R(U)上若有X→→Y在W(W U)上成立,则称X→→Y为R(U)的嵌入型多值依赖。
      但是在关系模式R(U)中函数依赖X→Y的有效性仅决定于X,Y这两个属性集的值。只要在R(U)的任何一个关系r中,元组在X和Y上的值满足定义5.l,则函数依赖X→Y在任何属性集W(XY W U)上成立。
    2. 若函数依赖X→Y在R(U)上成立,则对于任何Y' Y均有X→Y'成立。而多值依赖X→→Y若在R(U)上成立,我们却不能断言对于任何Y' Y有X→→Y'成立。

    总之,多值依赖存在这明显的冗余。

    来源:http://blog.sina.com.cn/s/blog_a637e97e01013220.html

    展开全文
  • 数据库之函数依赖多值依赖

    万次阅读 2019-04-30 19:31:57
    函数依赖是数据依赖一种,它反映属性或属性组之间依存,互相制约的关系,即反应现实世界的约束关系。 设R(U)是属性U上的一个关系模式,X和Y均为U={A1 , A2 , . . . ,An}的子集,r为R的任一关系,如果对于r中的...

    一、函数依赖(Functional Dependency)的概念

    函数依赖是数据依赖的一种,它反映属性或属性组之间依存,互相制约的关系,即反应现实世界的约束关系。

    设R(U)是属性U上的一个关系模式,X和Y均为U={A1 , A2 , . . . ,An}的子集,r为R的任一关系,如果对于r中的任意两个元组u,v,只要有u[X]=v[Y],就有u[Y]=v[Y],则称X函数决定Y,或称Y函数依赖于X,记为X->Y。

    简单来说,就是一个属性可以唯一决定另一个属性。

    例:

    (学生:Sno学号,Sname姓名,Sdept系别)

    1、Sno->Sname,学号可以决定一个姓名。学号函数决定姓名
    2、Sname->Sdept,姓名可能会重复。姓名不能函数决定系别

    下面是自己总结的四种依赖关系:

    二、多值依赖(Functional Dependency)的概念

            设R(U)是一个属性集合U上的一个关系模式,X, Y, 和Z是U的子集,并且Z=U-X-Y,多值依赖X->->Y成立当且仅当对R的任一个关系r,r在(X,Z)上的每个值对应一组Y的值,这组值仅仅决定于X值而与Z值无关。

            若X->->Y,而Z=空集,则称X->->Y为平凡的多值依赖。否则,称X->->Y为非平凡的多值依赖。

    平凡多值依赖就是,属性集合中分为两个真子集,每一个X对应一组Y的取值

            可以看出,如果把上面的一组改为一个,那么多值依赖就变成了函数依赖。当然一个值组成的组也是组,所以说,函数依赖是多值依赖的特殊情况。

    多值依赖的性质:

    若 X->->Y , 则 X->->Z  多值依赖对称性

    若X->Y.则X->->Y   说明函数依赖是多值依赖的特殊情况,当X->Y的时候,对于每一个X都有一个Y与之对应,那么对于每一对X,Z都有一组Y与之对应

    设属性值之间有包含关系 XY包含于W包含于U 那么如果R(U)上有X->->Y,那么在R(W)上一世成立的

    若X->->Y 在R(U)上成立,且Y’ 包含于Y,不能断言 X->->Y’在R(U)上成立(注意和上一条性质不同) (因为多值依赖中的定义中涉及了U中除了X,Y之外的其余属性Z,因此换成Y’后就需要涉及Z’ = U-X-Y’ 比之前确定X->->Y的时候属性列多,就不一定了)

    展开全文
  • 轻松理解数据库必须掌握的数据依赖关系。

    我们先复习下什么是函数函数是发生在集合之间的一种对应关系(我喜欢用图理解)

    图中表示的是函数中的单射、满射和双射。简而言之就是集合的对应关系,而集合中的值一般满足一对一和多对一的关系,不能存在一对多的关系。


    基于上述对函数的理解,我们给出函数依赖的定义:

    设R(U)是属性集U上的关系模式,X,Y是U的子集,若对R(U)的任意一个可能的关系r,r中不可能存在两个元祖在X上的属性值相等,而在Y中的属性值不等,则记为X→Y。简而言之,函数依赖是某个属性集决定另一个属性集时,称另一属性集依赖于该属性集。(事实上就是不能出现一对多的关系)

    我们先区分函数依赖与属性集中属性的三种关系

    设R(U)是属性集U上的关系模式,X、Y是U的子集:

    ● 如果X和Y之间是1:1关系(一对一关系),如学校和校长之间就是1:1关系,则存在函数依赖X → Y和Y →X。

    ● 如果X和Y之间是1:n关系(一对多关系),如年龄和姓名之间就是1:n关系,则存在函数依赖Y → X。

    ●如果X和Y之间是m:n关系(多对多关系),如学生和课程之间就是m:n关系,则X和

    用数学上的映射关系来理解,比如f(x)=2x;f(x,y)=x^+2y;f(x,y,z)=x+y-z等等,函数中变量元对应U中的X,所有X中的确定值经过函数关系的运算后组成Y。

    其次,函数依赖包括以下几种

    1.平凡函数依赖

    当关系中属性集合Y是属性集合X的子集时,存在函数依赖X→Y,即一组属性函数决定它的所有子集,这种函数依赖称为平凡函数依赖。

    2.非平凡函数依赖

    当关系中属性集合Y不是属性集合X的子集时,存在函数依赖X→Y,则称这种函数依赖为非平凡函数依赖。

    3.完全函数依赖

    设X,Y是关系R的两个属性集合,X’是X的真子集,存在X→Y,但对每一个X’都有X’!→Y,则称Y完全函数依赖于X。

    4.部分函数依赖

    设X,Y是关系R的两个属性集合,存在X→Y,若X’是X的真子集,存在X’→Y,则称Y部分函数依赖于X。

    5.传递函数依赖

    设X,Y,Z是关系R中互不相同的属性集合,存在X→Y(Y !→X),Y→Z,则称Z传递函数依赖于X。(如果Y→X,则X→Z成立了)

    用一个例子来理解上述的定义(A—\ →B表示A 不函数依赖于 B)


    表1——学生(学号, 姓名, 性别, 年龄, 学院) 

    假设我们做表不允许重名

    学号→ 性别, 学号 → 年龄, 学号→ 学院,学号←→ 姓名,,姓名→ 性别, 姓名→ 年龄,姓名→ 学院,但性别—\ →Sage

    -----------------------------------------------------------------------------------------------------------------

    表2——学生课程(学号,课程,成绩)

    学号→课程,(学号,课程)→成绩

    -----------------------------------------------------------------------------------------------------------------

    表3——学院系(学号,系名,系主任)

    学号 → 系名,系名 → 系主任


    在上述例子中:

    平凡函数依赖: (学号,课程)→学号,(学号,课程)→课程。

    因为学号和课程都是(学号,课程)的子集。

    非平凡函数依赖: (学号,课程)→成绩(数据库中讨论得比较多是非平凡函数依赖,而平凡意义不大)

    因为成绩不是(学号,课程)的子集。

    部分函数依赖:(学号,姓名)→ 性别 

    因为(学号,姓名)→ 性别 且 学号 → 性别

    完全函数依赖:(学号,课程号)→ 成绩 

    因为(学号,课程号)→ 成绩,学号 —\→ 成绩,课程号 —\→ 成绩。

    传递函数依赖: 学号 → 系主任 

    因为学号 → 系名,系名 → 系主任 且 系名 —\→ 学号。

    而多值依赖呢?给出定义

    多值依赖的定义:
          设R(U)是一个属性集合U上的一个关系模式,X, Y, 和Z是U的子集,并且Z=U-X-Y,多值依赖X->->Y成立当且仅当对R的任一个关系r,r在(X,Z)上的每个值对应一组Y的值,这组值仅仅决定于X值而与Z值无关。
          若X->->Y,而Z=空集,则称X->->Y为平凡的多值依赖。否则,称X->->Y为非平凡的多值依赖。

    依然用函数的映射关系来理解,引入f(x,y),假设f(x,y)=+-(x^),若z=f(x,y),则一个x值可以得出两个互为相反数的z。在这个二元函数关系中,y的取值事实上是不影响结果的。类比到关系模式上,即x为X集的属性值,y为Y集的属性值,z为Z集的属性值。

    看看一个例子

    (课程C) ——(教师T)—(参考书B)

     数据库概率 —顾国生老师——数学分析
     数据库概率 —顾国生老师——高等代数
     数据库概率 —顾国生老师——微分方程

    上述例子U{C,T,B},其中课程C和教师T唯一确定一组B,却与T无关,经由C决定,然而T并不是空集,所以是非平凡的多值依赖。

    事实上,当T为空的时候,如果C中的每一个值c对应B中的一个确定的值,则变为函数依赖,所以函数依赖是多值依赖的一种特殊情况。


    总计下:

    1. 函数依赖不是指关系模式R的某个或某些关系实例满足的约束条件,而是指R的所有关系实例均要满足的约束条件。

    2. 函数依赖是语义范畴的概念。只能根据数据的语义来确定函数依赖。(例如“姓名→年龄”这个函数依赖只有在不允许有同名人的条件下成立)

    3. 函数依赖通常以集合抽闲出来讨论。

    4. 数据库设计者根据需求对函数关系进行制定。例如认为“姓名→年龄”在特定表中可行。

    5. 数据库设计者根据现实规定做强制要求。例如规定不允许同名人出现,函数依赖“姓名→年龄”成立。所插入的元组必须满足规定

    的函数依赖,若发现有同名人存在, 则拒绝装入该元组。




    展开全文
  • (1)基本概念回顾(2)关系模式的形式化定义(3)什么是数据依赖F?(4)数据依赖F对关系模式的影响1️⃣ 数据冗余(Data redundancy)2️⃣ 更新异常(update anomalies )3️⃣ 插入异常(insertion anomalies )4️⃣ ...


    0.思维导图

    在这里插入图片描述

    1.为什么要学习关系数据库规范化理论?

    感性认识:

    • 当我们面对一个实际问题时,我们应该如何去建数据库,建表,库的结构,表的结构我们该如何组织,才能更好的解决问题。
    • 如何省内存,提高查询修改删除更新的效率?
    • 如何避免可能出现的隐患,如修改删除更新插入等异常?
    • 以上就是关系数据库规范化理论研究解决的问题,说白了就是告诉你如何才能设计出合适的库和表

    下面我们回顾几个概念和问题,以便更好地学习后面的关系数据库规范化理论

    (1)基本概念回顾

    • 关系:可简单的理解为二维表

    • 关系模式:即二维表的逻辑结构

    • 关系数据库:指采用了关系模型来组织数据的数据库,其以行和列的形式存储数据,关系型数据库这一系列的行和列被称为表,一组表组成了数据库

    • 关系数据库的模式:即关系数据库的逻辑结构

    (2)关系模式的形式化定义

    • 这里我们回顾一下《数据库系统概论》中对二维表结构的定义

    关系模式由五部分组成,即它是一个五元组:
    R(U, D, DOM, F)
    R: 关系名,即表名
    U: 组成该关系的属性名集合
    D: 属性组U中属性所来自的域。数据的取值范围和类型
    DOM: 属性向域的映象集合
    F: 属性组U上的一组数据依赖。

    关系数据库规范化理论研究的就是R、F、U,之间的关系。
    因为D和DOM对研究表的设计关系不大,所以在学习关系数据库规范化理论时可以将五元组简化成三元组

    三元组:R(U, F)
    当且仅当U上的一个关系r满足F时,r称为关系模式 R(U, F)的一个关系

    (3)什么是数据依赖F?

    这里我们对F中的数据依赖进行简单解释,后面会详细叙述函数依赖多值依赖

    数据依赖一个关系内部属性与属性之间的一种约束关系。
    这种约束关系是通过属性间值的相等与否体现出来的数据间相关联系
    它是现实世界属性间相互联系的抽象,是数据内在的性质,是语义的体现。

    数据依赖分类:

    • 函数依赖(Functional Dependency,简记为FD)

    函数依赖极为普遍地存在于现实生活中。比如描述一个学生的关系,可以有学号(Sno)、姓名(Sname)、 系名(Sdept) 等几个属性。由于一个学号只对应一个学生,一个学生只在一一个系学习。因而当“学号”值确定之后,学生的姓名及所在系的值也就被唯一地确定了。属性间的这种依赖关系类似于数学中的函数y=f(x),自变量x确定之后,相应的函数值y也就唯一地确定 了。

    • 多值依赖(Multivalued Dependency,简记为MVD)
    • 其他

    (4)数据依赖F对关系模式的影响

    • 因为关系数据库规范化理论主要研究的是三元组R(U,F),U我们都好理解,最重要的是F,这里我们简单的了解一下F对关系模式,即表的逻辑结构的影响,让我们理性的认识为什么学习关系数据库规范化理论

    举个例子:

    [例1]建立一个描述学校教务的数据库,数据库涉及的对象有:
    学生的学号(Sno)、所在系(Sdept)、系主任姓名(Mname)、课程名(Cname)、成绩(Grade)

    这里我们用单一的关系模式Student来表示这些对象:
    Student <U、F>
    该关系的属性集合:
    U ={ Sno, Sdept, Mname, Cname, Grade }

    这里说明一下现实世界的事实语义,关于这些对象之间的联系:
    ①一个系有若干学生,但一个学生只属于一个系。
    ②一个系只有一名(正职)负责人。
    ③一个学生可以选修多门课程,每门课程有若干学生选修。
    ④每个学生学习每一一门课程有一个成绩。

    于是得到属性组U上的一组函数依赖F
    F={Sno- > Sdept, Sdept- >Mname, (Sno, Cno)- >Grade}
    (如图所示)

    在这里插入图片描述

    • 如果只考虑函数依赖这一种数据依赖, 可以得到一个描述学生的关系模式Student <U,F>。表6.1是某一时刻关系模式Student的一个实例,即数据表。
      在这里插入图片描述

    这个关系模式设计的并不好,存在以下问题:

    1️⃣ 数据冗余(Data redundancy)

    • 比如,每一个系的系主任姓名重复出现,重复次数与该系所有学生的所有课程成绩出现次数相同,如表6.1所示。这将浪费大量的存储空间。

    2️⃣ 更新异常(update anomalies )

    • 由于数据冗余,当更新数据库中的数据时,系统要付出很大的代价来维护数据库的完整性,否则会面临数据不一致的危险。 比如,某系更换系主任后,必须修改与该系学生有关的每一个元组。

    3️⃣ 插入异常(insertion anomalies )

    • 如果一个系刚成立,尚无学生,则无法把这个系及其系主任的信息存入数据库。

    4️⃣ 删除异常( deletion anomalies)

    • 如果某个系的学生全部毕业了,则在删除该系学生信息的同时,这个系及其系主任的信息也丢掉了。

    鉴于存在以上种种问题,可以得出这样的结论:

    • Student关系模式不是一个好的模式
    • “好”的模式:
      不会发生插入异常、删除异常、更新异常,数据冗余应尽可能少
    • 原因:由存在于模式中的某些数据依赖引起的
    • 解决方法:通过分解关系模式消除其中不合适 的数据依赖

    可以把这个单一模式分成3个关系模式:

    • S(Sno,Sdept,Sno → Sdept);
    • SC(Sno,Cno,Grade,(Sno,Cno) → Grade);
    • DEPT(Sdept,Mname,Sdept→ Mname)

    这三个模式都不会发生插入异常、删除异常的问题,数据的冗余也得到了控制。
    一个模式的数据依赖会有哪些不好的性质,如何改造一个不好的模式,这就是接下来2.规范化要讨论的内容。

    2.规范化—改造关系模式,解决插入异常、删除异常、更新异常和数据冗余问题。

    (1)规范化研究什么?

    • 规范化讨论如何根据属性间依赖情况来判定关系是否具有某些不合适的性质
    • 通常按属性间依赖情况来区分关系规范化程度第一范式、第二范式、第三范式和第四范式等
    • 用来改造关系模式,通过分解关系模式来消除其中不合适的数据依赖,以解决插入异常、删除异常、更新异常和数据冗余问题。

    接下来我们依次学习以下内容,来更好的掌握规范化理论,来更好的设计表的结构,设计关系模式。

    • 函数依赖
    • 范式
    • 2NF
    • 3NF
    • BCNF
    • 多值依赖
    • 4NF

    其中函数依赖、码是为了学习范式、1NF,2NF,3NF……打基础

    (2)函数依赖

    这里我们讨论数据依赖F中的函数依赖,分为以下几种类型:

    • 函数依赖
    • 平凡函数依赖与非平凡函数依赖
    • 完全函数依赖与部分函数依赖
    • 传递函数依赖

    ① 函数依赖

    在这里插入图片描述

    注意:函数依赖不是指关系模式R的某个或某些关系满足的约束条件,而是指R的一切关系均要满足的约束条件。

    以下是一个错误的例子:
    sno->sdept,sno应该唯一决定sdept
    在这里插入图片描述

    函数依赖和别的数据依赖样是语义范畴的概念,只能根据语义来确定一个函数依赖。
    例如,姓名→年龄这个函数依赖只有在该部门没有同名人的条件下成立。如果允许有同名人,则年龄就不再函数依赖于姓名了。

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

    在这里插入图片描述
    在这里插入图片描述

    ③ 完全函数依赖与部分函数依赖

    在这里插入图片描述
    在这里插入图片描述

    ④ 传递函数依赖

    在这里插入图片描述
    在这里插入图片描述
    直接依赖这里我们举个例子:
    BH(sno,idCard,address)

    X:sno 学号
    Y:idCard 身份证号
    Z:address 住址
    X->Y,Y->X,X<->Y,Y->Z
    所以我们说Z直接依赖于X

    (3)码

    • 码是关系模式中的一个重要概念。在 码的定义中有关码的若干定义, 这里用函数依赖的概念来定义码。
    • 码唯一决定一个实体集

    ① 候选码、超码、主码

    在这里插入图片描述

    ② 主属性和非主属性

    主属性与非主属性

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

    举几个例子:

    [例2]
    关系模式S(Sno,Sdept,Sage),单个属性Sno是
    SC(Sno,Cno,Grade)中,(Sno,Cno)是

    [例3]
    关系模式R(P,W,A)
    P:演奏者 W:作品 A:听众
    一个演奏者可以演奏多个作品
    某一作品可被多个演奏者演奏
    听众可以欣赏不同演奏者的不同作品
    码为(P,W,A),即All-Key

    ③ 外部码

    在这里插入图片描述

    (4)范式

    • 范式是符合某一种级别的关系模式的集合
    • 关系数据库中的关系必须满足一定的要求。满足不同程度要求的为不同的范式。
    • 级别越高,表设计的越合理

    范式的种类:

    在这里插入图片描述
    各种范式之间存在联系:

    在这里插入图片描述

    • 某一关系模式R为第n范式,可简记为R∈nNF。
      一个低一级范式的关系模式,通过模式分解可以转换为若干个高一级范式的关系模式的集合,这种过程就叫规范化

    ① 1NF

    1NF的定义:

    • 如果一个关系模式R的所有属性都是不可分的基本数据项,则R∈1NF
    • 第一范式是对关系模式的最起码的要求。不满足第一范式的数据库模式不能称为关系数据库
    • 但是满足第一范式的关系模式并不一定是一个好的关系模式

    以下是一个满足1NF,但不是好的关系模式的例子:

    关系模式 S-L-C(Sno, Sdept, Sloc, Cno, Grade)
    Sloc为学生住处,假设每个系的学生住在同一个地方

    • 这个例子中存在函数依赖,不是一个好的关系模式

    在这里插入图片描述
    图形化表示:
    在这里插入图片描述
    S-L-C不是一个好的关系模式,一个关系模式 R不属于2NF,就会产生以下几个问题:

    • (1)插入异常。假若要插入一个学生Sno=S7, Sdept =PHY, Sloc =BLD2, 但该生还未选课,即这个学生无Cno,这样的元组就插不进S-L-C中。因为插入元组时必须给定码值,而这时码值的一部分 为空,因而学生的固有信息无法插入。
    • (2)删除异常。假定某个学生只选一门课,如S4就选了一门课C3,现在C3这门课他也不选了,那么C3这个数据项就要删除。而C3是主属性,删除了C3,整个元组就必须一起删除,使得S4的其他信息也被删除了,从而造成删除异常,即不应删除的信息也删除了。
    • (3)修改复杂。某个学生从数学系(MA)转到计算机科学系(CS),这本来只需修改此学生元组中的Sdept分量即可,但因为关系模式S-L-C中还含有系的住处Sloc属性,学生转系将同时改变住处,因而还必须修改元组中的Sloc分量。另外,如果这个学生选修了k门课,Sdept、 Sloc重复存储了k次,不仅存储冗余度大,而且必须无遗漏地修改k个元组中全部Sdept、Sloc 信息,造成修改的复杂化

    为什么会有这些问题呢?

    • 原因:
      Sdept、 Sloc部分函数依赖于码
    • 解决方法(也就是2NF的处理方法)
      S-L-C分解为两个关系模式,以消除这些部分函数依赖
      SC(Sno, Cno, Grade)
      S-L(Sno, Sdept, Sloc)
      在这里插入图片描述

    ② 2NF

    在这里插入图片描述

    • 采用投影分解法将一个1NF的关系分解为多个2NF的关系,可以在一定程度上减轻原1NF关系中存在的插入异常、删除异常、数据冗余度大、修改复杂等问题。

    • 将一个1NF关系分解为多个2NF的关系,并不能完全消除关系模式中的各种异常情况和数据冗余。所以又引入了3NF。

    ③ 3NF

    在这里插入图片描述
    这里我们对上面的2NF例子再次进行剖析:在这里插入图片描述
    在这里插入图片描述

    解决方法:

    • 采用投影分解法,把S-L分解为两个关系模式,以消除传递函数依赖
      S-D(Sno, Sdept)
      D-L(Sdept,Sloc)
    • S-D的码为Sno, D-L的码为Sdept。
    • 分解后的关系模式S-D与D-L中不再存在传递依赖

    在这里插入图片描述

    • 采用投影分解法将一个2NF的关系分解为多个3NF的关系,可以在一定程度上解决原2NF关系中存在的插入异常、删除异常、数据冗余度大、修改复杂等问题。

    • 将一个2NF关系分解为多个3NF的关系后,仍然不能完全消除关系模式中的各种异常情况和数据冗余。

    ④ BCNF

    BCNF ( Boyce Codd Normal Form)是由Boyce与Codd提出的,比上述的3NF又进了一步,通常认为BCNF是修正的第三范式,有时也称为扩充的第三范式。

    在这里插入图片描述

    在这里插入图片描述
    下面用几个例子说明属于3NF的关系模式有的属于BCNF,但有的不属于BCNF。

    [例5] 关系模式C(Cno,Cname,Pcno)
    C∈3NF
    C∈BCNF

    关系模式C(Cno, Cname, Peno), 它只有一个码Cno, 这里没有任何属性对Cno部分依赖或传递依赖,所以C∈3NF。同时C中Cno唯一的决定因素, 所以C ∈BCNF。

    [例6]关系模式S(Sno, Sname, Sdept, Sage)
    假定S有两个码Sno,Sname
    S∈3NF。
    S ∈ BCNF

    假定Sname也具有唯一性, 那么S就有两个码,这两个码都由单个属性组成,彼此不相交。其他属性不存在对码的传递依赖与部分依赖,所以S∈3NF。
    同时S中除Sno、Sname外没有其他决定因素,所以S也属于BCNF。

    [例7]关系模式SJP(S,J,P)
    SJP∈3NF,
    SJP∈BCNF

    [例6.7]关系模式SJP(S, J, P)中,S是学生,J表示课程,P表示名次。
    每一个学生选修每门课程的成绩有一定的名次,
    每门课程中每一名次只有一个 学生(即没有并列名次)。
    由语义可得到下面的函数依赖:
    (S,J)→P; (J,P)→S
    所以(S,J) 与(J,P)都可以作为候选码
    这两个码各由两个属性组成,而且它们是相交的。
    这个关系模式中显然没有属性对码传递依赖或部分依赖。
    所以SJP∈3NF,而且除(S,J)与(J,P)以外没有其他决定因素,所以SJP∈BCNF。

    [例8] 关系模式STJ(S, T, J)中,S表示学生,T表示教师,J表示课程。

    每一教师只教一门课,
    每门课有若干教师,
    某一学生选定某门课, 就对应一个固定的教师。
    由语义可得到如下的函数依赖。
    (S,J)→T,(S,T)-J, T→J
    函数依赖关系可以用如图表示
    在这里插入图片描述
    这里(S,J)、 (S,T)都是候选码
    STJ是3NF,因为没有任何非主属性对码传递依赖或部分依赖
    STJ不是BCNF关系因为T是决定因素,而T不包含码。

    如何解决才能让STJ是BCNF关系呢?

    ⑤ 3NF与BCNF的关系

    在这里插入图片描述

    • 3NF和BCNF是在函数依赖的条件下对模式分解所能达到的分离程度的测度。
    • 一个模式中的关系模式如果都属于BCNF,那么在函数依赖范畴内它已实现了彻底的分离,已消除了插入和删除的异常。
    • 3NF的“不彻底”性表现在可能存在主属性对码部分依赖传递依赖

    (5)多值依赖

    • 前面我们讲了数据依赖分为函数依赖和多值依赖,函数依赖在上面已经叙述了,这里我们再讨论多值依赖。

    用一个例子引入多值依赖:

    [例9] 学校中某一门课程由多个教师讲授,他们使用相同的一套参考书。每个教员可以讲授多门课程,每种参考书可以供多门课程使用。

    可以用一个非规范化的关系来表示教师T、课程C和参考书B之间的关系
    在这里插入图片描述
    把这张表变成一张规范化的二维表:
    在这里插入图片描述

    • 关系模型Teaching (C, T,B)的码是(C, T, B),即all-key,因而Teaching∈BCNF。

    • 但是当某一课程(如物理)增加一名讲课教师(如周英)时,必须插入多个(这里是三个)元组:
      (物理,周英,普通物理学),(物理,周英,光学原理),(物理,周英,物理习题集)。

    • 同样,某一门课(如数学)要去掉一本参考书(如微分方程),则必须删除多个(这里是两个)元组:
      (数学,李勇微分方程),(数学,张平微分方程)。

    • 可以看出对数据的增删改很不方便,数据的冗余也十分明显。

    • 仔细考察这类关系模式,发现它具有一种称之为多值依赖(Multi-Valued Dependency, MVD)的数据依赖。

    ① 多值依赖的定义

    在这里插入图片描述

    例如,在关系模式Teaching中,对于一个(物理,光学原理)有一组T值{李勇,王军},这组值仅仅决定于课程C上的值(物理)。
    也就是说对于另一个(物理,普通物理学),它对应的一组T值仍是{李勇,王军},尽管这时参考书B的值已经改变了。
    因此T多值依赖于C,即C→→T

    在这里插入图片描述

    在这里插入图片描述

    ② 平凡多值依赖和非平凡多值依赖

    在这里插入图片描述
    下面再举一个具有多值依赖的关系模式的例子。

    • 对于W的每一个值Wi, S有一个完整的集合与之对应而不问C取何值。所以W→→S(多值依赖)。
      在这里插入图片描述

    如果用图下图来表示这种对应
    在这里插入图片描述

    • 则对应W的某一个值Wi的全部S值记作{S}wi (表示此仓库工作的全部保管员)
    • 全部C值记作{C}wi (表示在此仓库中存放的所有商品)。
    • 应当有{S}wi中的每一个值和{C}wi中的每一个C值对应。
    • 于是{S}wi与{C}wi之间正好形成一个完全二分图,因而W→→S
    • 由于C与S的完全对称性,必然有W→→C成立。

    多值依赖具有以下性质:

    在这里插入图片描述

    ③ 多值依赖与函数依赖的区别

    在这里插入图片描述

    (6)4NF

    在这里插入图片描述在这里插入图片描述

    在这里插入图片描述

    (7)规范化小结—重点归纳步骤

    • 关系数据库的规范化理论是数据库逻辑设计的工具

    • 目的:尽量消除插入、删除异常,修改复杂,数据冗余

    • 基本思想:逐步消除数据依赖中不合适的部分
      实质:·概念的单一化·

    关系模式规范化的基本步骤:

    在这里插入图片描述

    参考:《数据库系统概论第五版》—王珊

    展开全文
  • 从本篇文章开始,会开始系统性地介绍angular是如何实现依赖注入这一重要特性...所谓依赖注入(Dependency Injection),它其实是一个更大的名为控制反转(Inverse of Control)概念的一种实现模式。只不过这种实现策略使用
  • 这两天学习设计模式,看到了关于依赖反转方面的东西,就依赖反转而言简单来说就是:软软设计存在抽象层和实现层之分,一般情况下是抽象依赖于实现,这很容易理解,但是问题在于抽象层相对稳定,实现层容易变化,抽象...
  • Spring的五种依赖注入方式

    万次阅读 多人点赞 2019-05-07 19:11:28
    平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例...依赖注入的另一种说法是“控制反转”,通俗的理解是:平常我们new一个实例,这个实例的控制权是我们程序员,而控制...
  • 关于Spring IOC (DI-依赖注入)你需要知道的一切

    万次阅读 多人点赞 2017-01-19 16:46:27
    【版权申明】未经博主同意,不允许转载!...《Spring入门经典》这本无论对于初学者或者有经验的工程师还是很值一看的,最近花了点时间回顾了Spring的内容,在此顺带记录一下,本篇主要与spring IOC ,这篇博文
  • 依赖注入的原理

    万次阅读 多人点赞 2016-07-12 11:26:31
    什么是依赖注入依赖注入是实现程序解耦的一种方式。如果通过百度搜索可以找到如下答案: 控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题.控制反转一般...
  • .net的通用Dictionary集合类有一个“键”唯一约束。考虑这样一种情况:你想在Dictionary中存Author Name以及Articles。首先,你想加入Bob->Article_Good_One,而当你想加入Bob->Article_Good_Second,你将得
  • 依赖注入是什么?

    千次阅读 2019-01-13 20:42:24
    Spring的两个核心内容为控制反转(Ioc)和面向切面(AOP),依赖注入(DI)是控制反转(Ioc)的一种方式。 依赖注入这个词让人望而生畏,现在已经演变成一项复杂的编程技巧 或设计模式理念。但事实证明,依赖注入并...
  • spring 依赖注入的3方式

    千次阅读 2020-02-13 01:59:11
    另一类则是依赖注入,而Spring主要使用的是依赖注入。一般而言,依赖注入可以分为3方式。  •构造器注入。  •setter注入。  •接口注入。  构造器注入和setter注入是主要的方式,而接口注入是从别的地方注入...
  • 在前面介绍angular中依赖注入相关的概念和细节时,非常次提到了provider这个概念,每次提到都会让大家再等等,再等等。现在再也等不了啦,从本篇文章开始就会陆续介绍provider和一些基于provider的高层方法,比如...
  • UML中关联、泛化、依赖、实现的几关系

    千次阅读 热门讨论 2014-10-14 10:27:51
    学习《设计模式》好长时间了,可是到现在还是分不太清楚几UML中的几关系。如果这几关系理解的不是很透彻的话,那么会直接影响到对类图之间关系的理解,下面就来分析下几关系吧!     类之间的关系 ...
  • 依赖属性(Dependency Properties)进阶()

    千次阅读 2014-01-22 23:54:54
    接着 依赖属性(Dependency Properties)基础 进行更深一步的学习。... 很多依赖项属性类都已经将默认元数据作为其注册过程的部分而创建。 这包含作为 WPF API 部分的依赖项属性。 通过其类继承继承依赖
  • 本文将继续前文,描述Spring IoC中的依赖处理。 一般的企业应用也不会只有...依赖注入依赖注入是个让对象只通过构造参数,工厂方法的参数或者配置的属性来定义他们的依赖。这些依赖也是对象所需要协同工作的对象。容
  • gradle的使用,依赖管理

    万次阅读 2015-11-19 17:37:23
    什么是依赖管理依赖管理可以分为两部分:依赖,即项目构建或运行时所需要的一些文件;二是发布,即构建完成后上传到某个地方。1.1 依赖大部分的项目都需要第三方库类或项目文件,这些文件就是项目的依赖了。...
  • Gradle笔记——依赖管理基础

    万次阅读 2014-11-06 23:40:44
    依赖管理可以分为两部分:依赖,即项目构建或运行时所需要的一些文件;二是发布,即构建完成后上传到某个地方。 1.1 依赖 大部分的项目都需要第三方库类或项目文件,这些文件就是项目的依赖了。比如JDBC的jar...
  • Bean 的三种依赖注入方式介绍

    万次阅读 2018-08-20 16:17:46
    依赖注入:让调用类对某接口实现类的依赖关系由第三方注入,以移除调用类对某接口实现类的依赖。 接下来将详细的向大家介绍Spring容器支持的三种依赖注入的方式以及具体配置方法: • 属性注入方法 • 构造...
  • 、算法的定义

    千次阅读 2019-01-22 17:55:20
    文章目录、算法的定义:二、基本特性:三、算法设计的要求:四、算法效率的度量方法:五、算法的时间复杂度六、算法的空间复杂度 、算法的定义: 算法是解决特定问题求解决步骤的描述,再计算机中表现为指令的...
  • 什么是循环依赖以及解决方式

    万次阅读 多人点赞 2019-03-30 17:18:50
    它发生在bean A依赖另一个bean B时,bean B依赖于bean A: 豆A→豆B→豆A 当然,我们可以有更的暗示: 豆A→豆B→豆C→豆D→豆E→豆A 2.春天会发生什么 当Spring上下文加载所有bean时,它会尝试按照它们...
  • 学习过Spring框架的人一定都会听过Spring的IoC(控制反转) 、DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC 、DI这两个概念是模糊不清的,是很难理解的,今天和大家分享网上的一些技术大牛们对Spring...
  • 依赖注入:让调用类对某接口实现类的依赖关系由第三方注入,以移除调用类对某接口实现类的依赖。 接下来将详细的向大家介绍Spring容器支持的三种依赖注入的方式以及具体配置方法: • 属性注入方法 • 构造...
  • Spring的核心机制:依赖注入

    千次阅读 2014-11-24 15:36:41
    对于一般的Java项目,他们都或多或少有一种依赖型的关系,也就是由一些互相协作的对象构成的。Spring把这种互相协作的关系称为依赖关系。如A组件调用B组件的方法,可称A组件依赖于B组件,依赖注入让Spring的Bean以...
  • RDD和它依赖的父RDD(s)的关系有两不同的类型,即窄依赖(narrow dependency)和宽依赖(wide dependency)。如图所示显示了RDD之间的依赖关系???? 窄依赖:是指每个父RDD的每个Partition都只被子RD...
  • Spring(03)——依赖注入

    千次阅读 2017-07-03 17:52:44
    本文主要介绍Spring依赖注入的几方式,包括set方法注入、构造方法注入,idref、级联注入等。
  • Dagger2是一种依赖注入的框架,能够在编译时自动生成出一些代码,这些代码可以帮助对应的实例初始化。 ,它是鼎鼎大名的Square公司旗下又一把利刃,还有一把黄油刀,叫做ButterKnife。 Dagger2起源于Dagger,是一款...
  • 关于《道法自然》书中的“依赖倒置”问题

    千次阅读 热门讨论 2004-10-27 14:51:00
    例如,前几天位读者就“依赖倒置”原则来信指出了《道法自然》中的个错误。在此,我向那位读者表示真诚的谢意,并将他的来信和王咏武的回复邮件贴在这里,供大家参考。最近在书店里买到你们的新书《道法自然》。...
  • Spark中的窄依赖和宽依赖

    千次阅读 2018-05-24 16:56:03
    今天我们来谈谈Spark中的窄依赖和宽依赖。RDD大家应该有一定的理解了,弹性的分布式数据集,这里的弹性依赖于RDD之间的依赖关系,即使数据丢失也能重新计算。RDD之间的依赖关系又分为窄依赖和宽依赖,那到底什么是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 482,129
精华内容 192,851
关键字:

关于多值依赖的另一种定义是