4.规范化理论
4.1函数依赖
设R(U)是属性U上的一个关系模式,X和Y是U的子集,r是R的任一关系,如果对于r中的任意两个元组u,v,只要由u[Y] = v[Y],则称X函数决定Y,或成Y函数依赖于X,记为X->Y。
4.2 价值与用途
非规范化的关系模式,可能存在的问题包括:数据冗余、更新异常、插入异常、删除异常。
4.3 键
超键和候选键的区别:超键可能存在冗余属性,候选键是一定没有冗余属性的。
候选键也是能够唯一标识元组的。
候选键与主键的区别:候选键可以有多个,主键只能有一个
外键:别的关系的主键。
4.4 求候选键
图示法
- 将关系模式的函数依赖关系用”有向图“的方式表示
- 找入度为0的属性,并以该属性集合为起点,尝试遍历有向图,若能正常遍历图中所有结点,则该属性集为关系模式的候选键
- 若入度为0的属性集不能遍历图中所有结点,则需要尝试性的将一些中间结点(既有入度,也有出度的结点)并入入度为0的属性集中,直至该集合能遍历图中所有结点,集合为候选键
A1 ABCD B
4.5 范式
- 主属性:包含在候选码中的属性,可以起到唯一标识的作用。
非主属性:不包含在任何一个候选码中的属性。
- 第一范式(1NF):在关系模式R中,当且仅当所有域只包含原子值,即每个分量都是不可再分的数据项,则称R是第一范式。
- 第二范式(2NF):当且仅当R是1NF,且每一个非主属性完全依赖主键(不存在部分依赖)时,则称R是第二范式
- 比如说,学号和课程号(两个主键)可以确定成绩和学分,这里面存在着课程号可以确定学分这个以来。
- 会发生数据冗余,更新异常,插入异常,删除异常。
- 解决方式:将课程号和学分提取出来作为一个新的关系。
- 第三范式(3NF):当且仅当R是1NF,且R中没有非主属性传递依赖码时,则称R是第三范式。
- 单主键是不存在部分依赖的说法
- 如果存在数据冗余,更新异常,插入异常,删除异常这些问题,还是将存在的问题的直接提取出来形成新的范式
- BC范式(BCNF):设R是一个关系模式,F是他的依赖集,R属于BCNF当且仅当其F中每个依赖的决定因素必定包含R的某个候选码。
- 例题:
- 如图可以看到SJ->T,ST->J。相当于遍历完所有的结点。这样话是满足第2,3范式的,因为没有部分依赖。
- 但是不满足BC范式,因为T->J,但是T不是候选码。
- 消除部分依赖,这个必须是在主键是多个属性的组合键这个场景下。
4.6 模式分解
- 第一种:经过多种转换,把拆分的表进行多种操作还原称原来的表。
- 第二种:
- 三个算式结果出来后,只要两个中间有一个是有依赖关系就证明是无损的。这种方法只能限制于分解称两个的,三个及三个以上该方法不适用。
5.并发控制
5.1 基本概念
- 事务:把多个操作封装起来,将多个操作看成一个整体进行操作
- 原子性、一致性、隔离性、持续性
- 并发产生的问题:丢失更新、不可重复读问题、“脏”数据的读出
- 封锁协议:要解决并发产生的问题这就引出了封锁协议。
- S封锁:共享锁,又称读锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。
- X封锁:排他锁,又称写锁。若事务T对数据对象A加上X锁,事务T可以读A也可以修改A,其他事务不能再对A加任何锁,直到T释放A上的锁。这保证了其他事务在T释放A上的锁之前不能再读取和修改A。
- 一级封锁协议:事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放。可防止丢失修改
- 二级封锁协议:一级封锁协议加上事务T在读取数据R之前先对其加S锁,读完后即可释放S锁。可防止丢失修改,还可防止读“脏“数据
- 三级封锁协议:一级封锁协议加上事务T在读取数据R之前先对其加S锁,直到事务结束才释放。可防止丢失修改、防止读”脏“数据与防止数据重复读。
- 两段锁协议:可串行化的。可能发生死锁。
- 死锁问题:预防法、死锁的接触法
示例: