关系数据库的规范化理论是数据库逻辑设计的一个有力工具。

1、回顾关系模式

        第2章中已经讲过,一个关系模式应当是一个五元组:

                R(U,D,DOM,F)

        (1)R 关系名

        (2)U 一组属性(属性的集合)

        (3)D 属性组U中属性所来自的域(每个属性都来自一个域,这些域的集合就是D)

        (4)DOM 属性到域的映射

        (5)F 属性组U上的一组数据依赖 
由于(3)、(4)对模式设计关系不大,因此本章中把关系模式看作是一个三元组: R(U,F) 

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

作为关系,一个基本要求:

        每一个分量(属性)必须是不可分的数据项。满足了这个条件的关系模式属于第一范式(1NF 必须大写)。即:第一范式:每个属性必须是不可分的数据项

 2、数据依赖

        数据依赖是一个关系内部属性与属性之间的一种约束关系。

        它是现实世界属性间相互联系的抽象,是数据内在的性质,是语义的体现。

        人们已经提出了多种类型的数据依赖,其中最重要的是函数依赖(此处只讨论函数依赖)和多值依赖(涉及到第四范式)。

        函数依赖普遍存在于现实生活中。

        比如描述一个学生的关系,可以有学号,姓名,所在系等属性。一个学号对应一个学生,一个学生只在一个系学习。因而当学号值确定之后,学生的姓名及所在系的值也就被唯一确定。

        属性间的这种依赖关系类似于数学中的函数 y=f(x) ,自变量 x 确定之后,相应的函数值 y 也就唯一的确定了,即 sname=f(sno) , sdept=f(sno) , 即sno函数决定sname,sno函数决定sdept,或者说, sname和sdept函数依赖于sno(倒着说),记作:

sno->sname,sno->sdept
/*读作 sno函数决定于sname,反过来说sname 函数依赖于sno */

3、不规范的关系模式存在的问题

例:

        有一个关系(不规范),涉及学生的学号sno,姓名sname,所在系sdept,系主任姓名,课程号cno和成绩grade。

        该关系模式的属性集合:U={sno,sdept,mname,cno,grade对该问题的现实世界的语义:
        一个系有若干学生,一个学生只属于一个系;

        一个系只有一名主任;
        一个学生可以选修多门课程,每门课程有若干学生选修; 

        每个学生所学的每门课程都有一个成绩

于是得到属性U上的一组函数依赖F
        F={sno->sdept,sdept->mname,(sro,cno)->grade}
        该关系模式student<U,F>下的一个数据表如教材pl79所示。

        但这个关系模式存在以下问题:

        1)数据冗余太大

         每一个系的系主任姓名重复出现,重复次数与该系所有学生的所有课程成绩出现次数相同。浪费大量的存储空间。
        2)更新异常

        由于数据冗余,当更新数据时,维护数据完整性代价大。

        例如,某系更换系主任后,系统必须修改与该系学生有关的每一个元组。

        3)插入异常

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

        4)删除异常     

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

        由于上述问题,Student关系模式不是一个好的模式。

        一个好的关系模式应当不会发生插入异常、删除异常、更新异常,数据冗余应尽可能少。

        究其原因,是这个模式中的函数依赖存在某些不好的性质。

        假如把这个单一的模式改造一下(分解一下):        
        S(Sno,Sdept,Sno→Sdept);(学号函数决定所在系)
        sc(Sno,Cno,Grade,(Sno,Cno)→Grade);(学号和课程号联合函数决定成绩)
        dept(Sdept,Mname,Sdept→Mname)(系函数确定系主任)

        这三个关系模式都不会发生插入异常、删除异常、更新异常的问题,数据冗余也得到控制。

        规范化理论正是用来改造关系模式,通过分解关系模式来消除

      规范化

        研究内容:

        研究关系属性间不同的依赖情况(通过函数依赖):

        研究如何根据属性依赖(函数依赖)情况来判定关系是否具有某些不合适的性质;

        研究如何将具有不合适性质的关系转换为合适的形式;

        研究按属性间依赖情况来区分关系规范化的程度的第一范式、第二范式、第三范式、BCNF、第四范式。

        4、 函数依赖(需要掌握)

        定义:

        设R(U)是属性集U上的关系模式,X和Y是U的子集。若对于R(U)的任意一个可能的关系r,r中不可能存在两个元组在X上的属性值相等,而在Y上的属性值不等,则称“X函数确定Y”或“Y函数依赖于X”,记作X→Y。

        说明:
        函数依赖不是指关系模式R的某个或某些关系实例满足的约束条件,而是指R的所有关系实例均要满足的约束条件。
        函数依赖是语义范畴的概念。只能根据数据的语义来确定函数依赖。

        例如“姓名一年龄”这个函数依赖只有在不允许有同名人的条件下成立。
        数据库设计者可以对现实世界作强制的规定。例如规定不允许同名人出现,函数依赖“姓名→年龄”成立。所插入的元组必须满足规定的函数依赖,若发现有同名人存在,则拒绝装入该元组。

         例:

        对于关系模式Student(SnoSnameSsexSageSdept),假设不允许重名,则有:

        Sno→SnameSno → SsexSno→SageSno→SdeptSname→SnoSname→ SsexSname→Sage         Sname→Sdept

        一些术语和记号:

         (1)非平凡函数依赖/平凡函数依赖(1NF(第一范式)基础)

        →如果X→Y,但Y不是X的子集,则称 X→Y 是非平凡的函数依赖,
                例,在关系模式sc(Sno,Cno,Grade)中(Sno,Cno)→Grade非平凡函数依赖
        →若X→Y,但Y是X的子集,则称X→Y是平凡的函数依赖。
                例,在关模式sC(Sno,Cno,Grade)中(Sno,Cno)→Sno平凡函数依赖
        对于任一关系模式,平凡函数依赖都是必然成立的,它不反映新的语义。

        这里讨论非平凡的函数依赖。
        若X→Y,则X称为这个函数依赖的决定属性组,或决定因素。

        若X→Y,并且Y→X,则记为X<->X。

        若Y不函数依赖于X,则记为X!→Y(应该再箭头上打一个斜号)。 

       (2)完全函数依赖/部分函数依赖定义(2NF(第二范式)基础)

 在关系模式R(U)中,如果X→Y,并且对于X的任何一个真子集X’,都有Y不函数依赖于X’,则称Y完全函数依赖于X,记作X→Z(箭头上加一个F)。

        结论:单个属性的决定因素一定是完全函数依赖,原因就是一个元素没有真子集,真子集不包含空集和自身

        若X→Y,但Y不完全函数依赖于X,则称Y部分函数依赖于X,记作x→y(箭头上加个p)。

        例:在关系模式student(sno,sdept,mname,cno,grade)中,

        (Sno,Cno)->(箭头上加F)Grade是完全函数依赖;

        原因:Sno的子集有:sno 、cno  而Grade不能函数依赖于sno 也不能函数依赖于cno 

        (Sno,Cno)→Sdept是部分函数依赖(箭头上加上p)。

        原因:Sno的子集有:sno 、cno  而 Sdept是函数依赖于sno的,所以依赖于X(Sno,Cno)的真子集。所以是部分函数依赖。

 (3)传递函数依赖(3NF(第三范式)的基础)

在关系模式R(U)中,如果X→Y(Y不是X的子集),Y→Z,且Y不函数确定X,Y函数依赖Z,Z不是Y的真子集,则称Z传递函数依赖于X,记为:X->Z(箭头上加“传递”)。

        例:

        在关系模式student(sno,sdept,mname,cno,grade)中,

         Sno→Sdept,Sdept→Mname,则Mname传递函数依赖于Sno

        加上条件“Y不函数确定X”,是因为如果Y→X,则X←→Y,实际上是Z直接函数依赖X,而不是传递函数依赖。

     这里用函数依赖的概念来定义码:
        设K为关系模式R<U,F>中的属性或属性组合。若U完全函数依赖K,则K称为R的一个侯选码(CandidateKev)。若关系模式R有多个候选码,则选定其中的一个作为主码(Primarykey)。
        主属性和非主属性。包含在任何一个候选码中的属性,称为主属性,不包含在任何码中的属性称为非主属性或非码属性。 

例:

        student ( sno,sname,ssex,sage,sdept )

         sno可以函数确定sname

        sno可以函数确定sage

        sno可以函数确定ssex

        sno可以函数确定sdept

        所以sno是定义中的K,sno可以完全函数确定其它属性,或者说其它属性完全函数依赖于sno(即K),sno是一个候选码,是主属性,其它的都是非主属性

 如何通过函数依赖确定一个码: 

        看K是否能函数确定其它的属性 ,如果全部函数确定U集合中的所有属性就是码

大致步骤:

        先分析关系模式中的函数依赖,把所有的函数依赖列出来,看一下属性或属性组能不能函数确定其它的码,如果能就是候选码。 

第六章的内容需要反复的理解,看两遍以上

关系数据理论(回顾关系模式、数据依赖、不规范的关系模式存在的问题、 函数依赖、非平凡函数依赖/平凡函数依赖、完全函数依赖/部分函数依赖定义、传递函数依赖,码)相关推荐

  1. (数据库系统概论|王珊)第六章关系数据理论-第一节:为什么要研究关系数据理论

    文章目录 一:概念回顾:关系模式 二:数据依赖 三:一个例子:不遵循关系数据理论导致的问题 一句话,研究关系数据库理论就是为了设计出合适的关系模式,也即合适.高效的表 一:概念回顾:关系模式 相关文章 ...

  2. 【数据库系统设计】关系数据理论(函数依赖、码、范式、模式分解)

    关系数据理论 6.1 为什么要学习关系数据理论 什么是好的数据库逻辑设计 什么是数据依赖 关系模式的简化表示 6.2 规范化 - 关系的规范化理论 6.2.1 函数依赖 1.函数依赖 2.平凡函数依赖 ...

  3. 数据库原理与应用(SQL)——3、关系数据理论(函数依赖、闭包、函数依赖集的最小集、规范化---范式 )

    加油! 不要停止奔跑, 不要回顾来路, 来路无可眷顾, 值得期待的只有远方.  关系数据理论是关系数据库的理论基础, 为数据库设计提供了判别标准, 是设计关系数据库的指南. 数据存储异常(因为存在数据 ...

  4. 关系型数据库第四章笔记---关系数据理论

    文章目录 关系模式设计中的问题 关系规范化 数据依赖 函数依赖 函数依赖的定义 定义 满足依赖的关系 模式上成立的依赖 平凡函数依赖与非平凡函数依赖 完全函数依赖与部分函数依赖 传递函数依赖与直接函数 ...

  5. 第6章 关系数据理论—范式的介绍

    第6章 关系数据理论-范式的介绍 本文全部内容来自数据库系统概论(第5版)-王珊.萨师煊著 部分函数依赖图,出于自己的理解,如有错误,请大家评论指正! 范式:关系数据库中需要满足的一定要求的规范形式. ...

  6. 【数据库】关系数据理论习题及解析

    一.选择题 1. 为了设计出性能较优的关系模式,必须进行规范化,规范化主要的理论依据是( A) . A. 关系规范化理论 B. 关系代数理论 C.数理逻辑 D. 关系运算理论 2. 规范化理论是关系数 ...

  7. 数据库系统-关系数据理论

    数据库系统-关系数据理论 关系数据库规范化理论 关系数据库规范化是为了告诉你如何才能设计出合适的库和表. 关系模式由五部分组成,即它是一个五元组 ​ R(U,D,DOM,F) R: 关系名 U: 组成 ...

  8. 第6章 关系数据理论—多值依赖和4NF

    第6章 关系数据理论-多值依赖和4NF 本篇文章全部内容来自数据库系统概论第五版-王珊.萨师煊著. 这是对自己学习的总结,如有错误,请大家指正,一起进步! 1.多值依赖 例:学校某一门课程由多个教授讲 ...

  9. 数据库复试--关系数据理论(主观题)

    第五章 关系数据理论 1. 在关系模式R(D,E,G)中,存在函数依赖关系{E→D,(D,G)→E},则候选码是__________,关系模式R(D,E,G)属于____________. 正确答案: ...

  10. 数据库复习——关系数据理论中的几个重要概念(闭包,逻辑蕴含,覆盖...)

    前言 关系数据理论中几个比较抽象的概念 正文 一.函数依赖 定义 设R(U)是属性集合U={A1,A2,-,An}上的一个关系模式,X, Y是U上的两个子集,若对R(U)的任意一个可能的关系r, r中 ...

最新文章

  1. jdk动态代理实现原理
  2. MyBatis 几个常用的 jdbcType数据
  3. 恐怖如斯,阿里P9总结的这份Java八股文,已经帮近百人拿到offer了
  4. [css] 你有没有使用过“形似猫头鹰”(例:`* + *{ ... }`) 的选择器?
  5. 云+X案例展 | 金融类:青云QingCloud助力泰康人寿云计算演进之路
  6. 直播行业运维关注的流程图
  7. 人狠话不多,细说大牛直播SDK之RTMP播放器和RTSP播放器
  8. 关于谷歌不兼容showModalDialog的解决方案
  9. Android 开发中版本兼容性问题
  10. Python顺序结构
  11. 【Unity3D开发小游戏】《超级马里奥》游戏教程
  12. 简单的微信使用技巧,你需要掌握的技巧
  13. 产品包装设计在品牌和营销中的重要性
  14. Ubuntu Kylin使用docker单机部署Fate联邦学习框架
  15. 一个屌丝程序猿的人生(四十五)
  16. java 百万级数据处理_一次性查询百万级数据应该怎么处理?
  17. 匹兹堡大学计算机科学世界排名,2020年匹兹堡大学QS世界排名
  18. Tarjan算法详解(AcWing 1174 受欢迎的牛)
  19. transition过渡的基本概念(逆战班)
  20. 日志易之配置日志内容黑名单

热门文章

  1. 图的无权最短路径算法
  2. 安卓开发环境的搭建(安卓app开发流程)
  3. 执行unzip命令报错Archive: home.zip End-of-central-directory signature not found. Either this file is
  4. linux ssh 远程浏览器,使用浏览器通过ssh连接linux方法
  5. vue实现图片上传功能
  6. stm32移植lvgl
  7. NanoHTTPD----SimpleWebServer处理请求过程
  8. 中缀和后缀表达式的转换
  9. GaussDB ETCD 服务异常实例分析处理的5种方法
  10. PTA 7-2 一帮一