zoukankan      html  css  js  c++  java
  • 20.6.21补数据库原理笔记

    对码有部分依赖、对码有部分依赖,如果限定在非主属性。消除不好的依赖,达到2、3NF。如果进一步扩大到主属性,则消除不好的依赖后,达到BCNF,

    BCNF的例子复杂一些:

    48e7c3d3d3a10073be24586870c24e8

    这个是满足3NF,但是不满足BCNF的例子,运用模式分解

    76cbe12141088b3ab578bf7aaa94d9e

    分解之后,达到了BCNF,

    是否存在什么副作用?

    前边讲2NF、3N,给人的感觉似乎是越来越好

    只有好处没有坏处

    那么,3NF->BCNF

    是否也是 只有好处没有坏处?

    BCNF解决了函数依赖的所有问题,再往上

    需要分析新的数据依赖,多值依赖

    3912dedd6863694418eda6c32d6faa6

    每门课程有一组参考书,每门课程也有一组教师,并且,参考书和教师互相独立,即,不管哪个人上课,用的一套书都一样

    这个例子做成关系表,Teach(课程, 教师, 参考书)

    参考书和教师互相独立

    课程,->->教师,课程,->->参考书

    表示一门课程可以决定一组教师,或者,一门课程可以决定一组参考书

    并且,这种依赖关系不会受其它因素影响

    这个就是多值依赖的含义

    这里特别注意,不会受其它因素影响  这句话

    如果不加这句话,就没有意义了

    因为给定一个X,肯定对应了 一组Y

    关键是,X对应的这一组Y

    不会受到其它因素影响,直观地说

    就是把一个关系的所有列分成 X、Y、Z 三部分

    X决定一组Y,不受Z影响

    X决定一组Y,不受Z影响 称为 X->->Y

    读作,X多值决定Y或者,Y多值依赖于X

    现在来看一个特例,如果把关系的所有列分成两组,X和Y

    那么,会怎么样?

    结论是,必然有 X->->Y,因为这时候没有Z

    当然也无所谓 受Z的影响

    把关系的所有列分成两组 X和Y,则必然有 X->->Y

    这样的多值依赖称为平凡多值依赖

    和前边 平凡函数依赖 类似

    平凡多值依赖 对数据库设计没有用,所以,我们分析的都是 非平凡多值依赖

    也就是,把所有属性分成三份X、Y、Z的多值依赖

    接下来看上边的例子

    教师对课程有 非平凡多值依赖那么会带来什么影响?

    假如,数据库课程 有3位教师有5本参考书

    那么,表达数据库课程信息需要几行?15

    那现在换一个人上数据库有5本参考书

    那么,就需要换掉5行的内容

    从这里可以看出多值依赖也会造成数据冗余性和数据操作复杂

    能不能改善这个问题?

    答案是:可以

    但是,函数依赖在这里不起作用。因为现在的问题是 多值依赖

    类似前边。我们找到了 有问题的数据依赖,就针对 有问题的地方 进行模式分解

    课程->->教师 有问题,我们就对这里进行分解

    75e57fdb6983e3e402e8a7bfc252c97

    大家看一下上边的分解

    C是课程、T是教师、B是参考书

    分解以后,显然 非平凡多值依赖不见了,只剩下两列,变成了 平凡多值依赖

    大家再看刚才的问题:冗余度、数据操作

    更换一名课程教师,这时候只需要在 R(课程,教师) 关系里

    改动一行就够了,3名教师占3行

    5门课程,在另一张表里占5行

    这个就是,按照 非平凡多值依赖 进行模式分解

    我们再观察一个现象

    a3b7699957de63577061bac59287533

    选出一门课,改一种画法

    c4002778da43105d6e378a3e4cc1bbb

    离散数学、二分图

    二分图可以看出什么呢

    这就是 非平凡多值依赖 的一个特征

    叫做 对称性

    关系的所有列分成 X、Y、Z 三部分

    如果有 X->->Y

    那么,同时也必然有 X->->Z

    就是说, X->->Y 和 X->->Z 一定是成对出现的

    所以,大家分析关系模式

    就等于也发现了 X->->Z

    消除了 非平凡多值依赖

    就达到了更高级别的范式4NF

    还有一个问题大家考虑一下

    函数依赖 和 多值依赖 有什么联系?

    函数依赖,X决定一个Y

    多值依赖,X决定一组Y

    一个 是 一组 的 特例

    所以,函数依赖 一定是 多值依赖

    X->Y

    表达,X可以明确确定一个Y

    并且隐含了不受其它因素影响

    所以,可以把 函数依赖 看作是 多值依赖 的特殊情况

    b9579111fac600b0a9d2c0f79b98619

    假如,一张表有5列现在把这张表分解成5张

    每张表1列,大家说,这样分解以后满足几范式?4NF

    因为高一级范式包含了低一级范式的条件

    分成5个单列表,有没有意义?

    这个直观上看没有意义

    我们把数据放进表,就是因为列跟列之间有联系

    全都分开了,比如,你的名字和你的身高

    这样对处理问题完全没有帮助。但是,这是直观的说法

    研究数据库的科学家。从理论上提出了两个概念

    无损连接性和 保持函数依赖

    无损连接性 表示模式分解之后

    分解成的小表可以通过自然连接还原成原来的大表

    可以回想我们前边的例题全都是符合 无损连接性 的

    也就是说找到有问题的数据依赖

    从这里入手进行分解

    一定满足 无损连接性

    这就提醒我们模式分解不能凭感觉

    分解的前提是找到有问题的数据依赖

    如果你凭感觉随便分。那么,有可能分完了以后

    回头做连接数据会对不上

    再来看另外一项,保持函数依赖

    这一项的字面意思是,原来的大表中有多少函数依赖

    分解以后的小表里,函数依赖 一个都不能少

    当然,具体含义更复杂一些

    保持函数依赖 比较麻烦

    我们现在回头看前边BCNF的例子

    33d201f0a1f966659431925cc04f8ff

    11fd34b726486930f819e45eabb2f32

    分解前后函数依赖有没有变少?

    7e0ffe3c36abd12c37b0327e6c11eff

    这两个实际上是一个

    因为 T->J,显然有 (S,T)->J

    比如,身份证号可以决定你的身高,身份证号 再附加一个 姓名,肯定可以决定 身高

    抽象地表示是 X一方可以扩大

    分解前:

    ee8980a9af74e4ff21600984534345f

    分解后:

    efc2529376e5473bba785a6a49c6f4b

    分解后还有没有2bc8b0f8351177cd09b06b988c5728e

    没有

    直观的原因是左边(S,J)已经不在一张表里了

    或者说(S,J)是原先大表里的一个 候选码

    模式分解以后

    这个候选码不存在了

    书上并没有说 原先某个候选码不存在 和 函数依赖丢失 之间是否有什么联系

    但就这个例子而言似乎是这总原因造成的

    这是我的个人看法,未必正确

    大家听了以后自己思考

    这个例子至少提醒我们

    BCNF面临的问题是

    通过 主属性对码的部分依赖、传递依赖 进行分解

    得到的结果

    主属性,即 某一个候选码 的属性

    (这种分解

    可能会破坏一部分候选码

    进一步破坏掉一部分函数依赖,老师个人看法)

    书上只给出了一个结论:若要求分解保持函数依赖,那么模式分解一定能够达到3NF,但不一定能够达到BCNF

    大家看一下这句话。意思是,函数依赖一个都不丢失,可以保证达到3NF

    但是,从3NF再向BCNF走

    也许在 不丢失函数依赖 的条件下可以走到,但也可能无法走到,不一定能够达到BCNF

    模式分解的要求

    ⒈ 分解具有无损连接性

    ⒉ 分解要保持函数依赖

    ⒊ 分解既要保持函数依赖,又要具有无损连接性

    无损连接性和分解保持函数依赖是两个互相独立的标准

    互相独立,表示满足一个跟满足另一个无关

    具有无损连接性的分解不一定能够保持函数依赖

    保持函数依赖的分解也不一定具有无损连接性

    若要求分解具有无损连接性,那么模式分解一定能够达到4NF

    若要求分解保持函数依赖,那么模式分解一定能够达到3NF,但不一定能够达到BCNF

    若要求分解既具有无损连接性,又保持函数依赖,则模式分解一定能够达到3NF,但不一定能够达到BCNF

    再强调一点:根据 有问题的数据依赖 为线索,去做模式分解,一定满足 无损连接性


    关系数据库最有创造性的内容 范式理论

    数据库设计的核心任务=找出数据项+参照完整性+数据依赖

    8bf99be745086697252ab8df9f64fc2

    找出数据项这是需求分析的任务

    动词在数据库设计里 表达,联系表 对 基本表 的 参照

    第一步,根据 需求 的描述,把 名词、动词 分离出来

    第二步,名词对应基本表,动词对应联系表

    联系表 参照 基本表,所以,数据库设计的结果大体是

    6d6571155696b02cd4bdb37f26faaee

    数据库设计的结果

    1 是一组表

    2 里边的关键因素是,表之间的 参照 联系

    跟你们的UML类图很象

    但是比UML类图简单,因为UML里class之间的联系比较复杂

    动词----联系表,名词---基本表

    联系表 参照 基本表,把这个说法形象的表示

    书上叫做E -R图

    数据库的 参照前边讲过

    本质是 数量关系

    1:m表示 1个对应多个

    所以,数据库设计通常提取出名词、动词以后

    把它们画成E-R图的形式,容易看

    当然,画E-R图不算是必须的,你也可以直接画 关系图,许多设计数据库熟练的人会采取这种做法

    E-R图向关系模型的转换

    ⒈ 一个实体型转换为一个关系模式。

    ⒉ 一个m:n联系转换为一个关系模式(两边实体的主码加联系自身的属性)。

    ⒊ 一个1:n联系可以转换为一个独立的关系模式,也可以与n端对应的关系模式合并。

    ⒋ 一个1:1联系可以转换为一个独立的关系模式,也可以与任意一端对应的关系模式合并。

    ⒌ 三个或三个以上实体间的一个多元联系转换为一个关系模式。

    ⒍ 同一实体集的实体间的联系,即自联系,也可按上述1:1、1:n和m:n三种情况分别处理。

    ⒎ 具有相同码的关系模式可合并。

    大意是:

    m:n必须有独立的 联系表,而1:m,可以把 联系表 吸收进 基本表

    1:m  比如,学生表,系表两张表

    学生表 里有一列 系号,参照 系表

    相当于,把 联系表 吸收进 学生表

    你也可以不在学生表里放 系号

    而是单独建一张表 R(学号,系号)

    这样就把联系表独立出来

    两种做法都可以

    数据库设计基本工作完成

    但是,这时候的表因为是凭主观设计的,可能存在 不好的表

    所以,接下来,还需要用 数据依赖进行细致分析

    看看有哪些表不好需要分解

    数据库的物理设计:数据库在物理设备上的存储结构与存取方法的设计

    数据库实施:建表,输入数据,系统访问数据库试运行

    数据库运行与维护:系统日常运行与数据库维护

    数据库设计=1 提取 名词、动词 2 建立 联系表 参照 基本表 3 用范式理论优化表

    HOMEWORK:

    bbe961785dcc5aab0c8315c2fce763e

    随便用
  • 相关阅读:
    数学建模课程常用英语词汇(专业术语)
    MATLAB简易画图
    MATLAB与C语言对比实例:随机数生成
    C语言 投票系统:给定候选人,从键盘输入候选人的名字,统计票数,并输出最终获胜者
    C语言 一个数学问题:求s=(a^m)!+(b^n)!
    C语言 矩阵的转置及矩阵的乘法
    iOS_数据存取(二)
    iOS_数据存取(一)
    iOS_SDWebImage框架分析
    iOS_AFNetWorking框架分析
  • 原文地址:https://www.cnblogs.com/pqhuang/p/13174633.html
Copyright © 2011-2022 走看看