一句话,研究关系数据库理论就是为了设计出合适的关系模式,也即合适、高效的表
6.1为什么研究关系数据理论
一:概念回顾:关系模式
关系模式:关系模式就是对关系的描述,可以表示为
  
     
      
       
       
         R 
        
       
         ( 
        
       
         U 
        
       
         , 
        
       
         D 
        
       
         , 
        
       
         D 
        
       
         O 
        
       
         M 
        
       
         , 
        
       
         F 
        
       
         ) 
        
       
      
        R(U,D,DOM,F) 
       
      
    R(U,D,DOM,F)
- R:关系名
- U:组成该关系的属性名集合
- D:U中属性所来自的域
- DOM:属性向域的映像集合
- F:属性间数据的依赖关系集合
所以在本章中把关系模式看作一个三元组 
     
      
       
       
         R 
        
       
         < 
        
       
         U 
        
       
         , 
        
       
         F 
        
       
         > 
        
       
      
        R<U,F> 
       
      
    R<U,F>
 并且仅当U上的一个关系r满足F时,r称为关系模式R < U , F >的一个关系
二:数据依赖
数据依赖:数据依赖是一个关系内部属性与属性之间的一种约束关系。 这种约束关系是通过属性间值的相等与否体现出来的数据间相关联系。它是现实世界属性间相互联系的抽象,是数据内在的性质,是语义的体现。主要有两种类型的数据依赖
 
三:一个例子:不遵循关系数据理论导致的问题
【例】建立一个描述学校教务的数据库,该数据库涉及的对象包括
- 学生的学号(Sno)
- 所在系(Sdept)
- 系主任姓名(Mname)
- 课程号(Cno)
- 成绩(Grade)
假设用一个单一的关系模式Student来表示,则该关系模式的属性集合为
  
     
      
       
       
         U 
        
       
         = 
        
       
         ( 
        
       
         S 
        
       
         n 
        
       
         o 
        
       
         , 
        
       
         S 
        
       
         d 
        
       
         e 
        
       
         p 
        
       
         t 
        
       
         , 
        
       
         M 
        
       
         n 
        
       
         a 
        
       
         m 
        
       
         e 
        
       
         , 
        
       
         C 
        
       
         n 
        
       
         o 
        
       
         , 
        
       
         G 
        
       
         r 
        
       
         a 
        
       
         d 
        
       
         e 
        
       
         ) 
        
       
      
        U=(Sno,Sdept,Mname,Cno,Grade) 
       
      
    U=(Sno,Sdept,Mname,Cno,Grade)
 根据现实世界我们所熟知的,会有以下事实
- 一个系有若干学生,但一个学生只属于一个系
- 一个系只有一名(正职)负责人
- 一个学生可以选修多门课程,每门课程有若干学生选修
- 每个学生学习每一门课程有一个成绩
这样的语义限制,将会导致属性上的函数依赖
 
 记作:
  
     
      
       
       
         F 
        
       
         = 
        
       
         ( 
        
       
         S 
        
       
         n 
        
       
         o 
        
       
         − 
        
       
         > 
        
       
         S 
        
       
         d 
        
       
         e 
        
       
         p 
        
       
         t 
        
       
         ) 
        
       
      
        F=(Sno−>Sdept) 
       
      
    F=(Sno−>Sdept)
  
     
      
       
       
         S 
        
       
         d 
        
       
         e 
        
       
         p 
        
       
         t 
        
       
         − 
        
       
         > 
        
       
         M 
        
       
         n 
        
       
         a 
        
       
         m 
        
       
         e 
        
       
      
        Sdept−>Mname 
       
      
    Sdept−>Mname
  
     
      
       
       
         ( 
        
       
         S 
        
       
         n 
        
       
         o 
        
       
         , 
        
       
         C 
        
       
         n 
        
       
         o 
        
       
         ) 
        
       
         − 
        
       
         > 
        
       
         G 
        
       
         r 
        
       
         a 
        
       
         d 
        
       
         e 
        
       
         ) 
        
       
      
        (Sno,Cno)−>Grade) 
       
      
    (Sno,Cno)−>Grade)
下表是关系模式Student某一时刻的一个实例
 
 我们说,这样的关系模式是失败的,因为它存在以下问题
- 数据冗余:比如,每一个系的系主任姓名重复出现,重复次数与该系所有学生的所有课程成绩出现次数相同,这将浪费大量的存储空间
- 更新异常:比如,某系更换系主任后,必须修改与该系学生有关的每一个元组
- 插入异常:如果一个系刚成立,尚无学生,则无法把这个系及其系主任的信息存入数据库
- 删除异常:如果某个系的学生全部毕业了,则在删除该系学生信息的同时,这个系及其系主任的信息也丢掉了
6.2规范化
- 首先讨论一个关系属性间不同的依赖情况,讨论如何根据属性间依赖情况来判定关系是否具有某些不合适的性质
- 通常按属性间依赖情况来区分关系规范化程度为第一范式、第二范式、第三范式和第四范式等,然后直观地描述如何将具有不合适性质的关系转换为更合适的形式
一:函数依赖
函数依赖:如果X能确定Y(或者说Y依赖X,记作X->Y)那么就不可能存在两个元组,在X相同时Y却不同
如下在Student关系中,Sno确定Sdept,所以不可能出现两个相同的Sno却对应不同的Sdept
 
二、平凡函数依赖与非平凡函数依赖
- 非平凡函数依赖:如果X确定Y,但Y并不是X的子集,那么则称X是Y的非平凡函数依赖
- 平凡函数依赖:如果X确定Y,Y是X的子集,那么则称X是Y的平凡函数依赖(他依赖别人 还得走关系:是它的子集)
如下是一个典型例子
 
 注意
 
三、完全函数依赖与部分函数依赖
- 完全函数依赖:要想X是Y完全函数依赖,那么X中任何一个分量都不能丢,哪怕少一个,X都无法确定Y
- 部分函数依赖:X是Y的部分函数依赖,则表明即便去掉X中的一个或多个分量,剩余分量也能确定Y
如下是一个经典例子
 
四、传递函数依赖
传递函数依赖:如果X是Y的非平凡函数依赖,且Y不是X的函数依赖,同时Y是Z的非平凡函数依赖,则称Z对X传递函数依赖,记作
 
 注意,如果Y是X的函数依赖,则称Z直接依赖于X
6.3码
一、码的相关概念

 
 
 
 
其中:姓名,性别,期末分数都是非主属性
二、求解候选码
在范式之后,将求解候选码和第几范式放在一起
6.4秒杀范式
一、一句话解释清楚概念
-  1NF:非主属性 部分依赖于 候选码 
-  2NF:非主属性 完全依赖 任何一个候选码 
-  3NF: 消除 非主属性 的部分依赖 和 传递依赖 或 关系中元素均为主属性 也是3NF 
-  BCNF:3NF+在关系中,所有决定因子(箭头左侧)都是候选码本身(不可以是子集) 

 解释:单属性不代表都是主属性,但是单属性一定是没有了非主属性,所以必定是2NF



















