Skip to content

Lecture 7 关系数据库设计和关系规范化

:material-circle-edit-outline: 约 1805 个字 :material-clock-time-two-outline: 预计阅读时间 6 分钟

主要内容:

一个不好的关系数据模式会产生数据冗余、数据更新异常等问题。通过函数依赖的概念分析关系模式的规范化程度,并把不规范的关系模式分解为规范化的关系模式。讲授函数依赖的概念、Armstrong公理系统、关系模式的候选关键字(candidate key)以及关系模式分解的原则,即无损连接的分解和保持函数依赖的分解。

BCNF是函数依赖范畴内规范化程度最高的关系模式,而3NF是比BCNF低的规范化形式。一个关系模式总能无损连接地分解为BCNF 的关系模式,但不一定能保持函数依赖;若要求分解既是无损连接的又是保持函数依赖的,则保证可以分解为3NF。 通过考察多值依赖,还可以获得更高规范化的关系模式,即4NF。讲授函数依赖的相关概念 ,以及3NF和BCF的定义分解为BCNF和3NF的算法;介绍多值依赖及4NF的概念。

本节课体现关系模型的理论优势

Lossless-join Decomposition

好的关系模式需要保只有key可以唯一确认一条tuple,不能有其它相同地位的attribute

而且schema尽量小一些,这样表也能小很多

但是我们需要关注的是,拆分后的schema与原来的schema是否有数据变化

例如将下面的关系拆分为两个schema

inst_dept(id,name,salary,dept_name, building, budget)

->teacher(id,name,salary,dept_name)

->dept(dept_name, building, budget)

需要进行 自然连接 才能无损恢复,但也属于无损拆分

First Normal Form

表中无表,即每个属性都是不可分割的。

img

A relational schema R is in first normal form if the domains of all attributes of R are atomic

Domain is atomic if its elements are considered to be indivisible units

Examples of non-atomic domains:

Set of names, composite attribute

Identification numbers like CS101 that can be broken up into parts

  • Normal Forms(NF):
    1. 1NF
      1. 表中无表,即每个属性都是不可分割的。
      2. 不满足第一范式的数据库就不是关系型数据库,所以说能在MySql建立的表肯定满足第一范式。
    2. 2NF
      1. 满足第一范式基础上,非主属性必须完全依赖于主属性。
      2. 即主键的整体才能确定一个非主属性。
      3. 如果主键的部分属性就确定了一个非主属性就不满足第二范式。 1. 例如,一个表为 R (学号,课程号,成绩,姓名, 老师,老师职称) 2. 我们现在要新增一个学生,该学生还没有选课,因此就不能新增。课程号是关键码,又必须添加,产生了冲突。这是因为知道学号,姓名就确定一个学生,并不需要课程号。 3. 这个R就不是第二范式
    3. 3NF
    4. BCNF
    5. 4NF

一个关系模式,如果只有key能够决定所有的属性,就达到了BCNF

确认一个关系模式好坏的具体理论,包括:

  • functional dependencies
  • multivalued dependencies

Functional Dependencies

函数依赖

什么是函数依赖

image-20240408193234260

就是属性\(\alpha \(的value确定了,\)\beta\)也就确定了。两个tuple的\(\alpha\)相同,那么\(\beta\)也一定相同

如两个表里,同一个学号一定对应同一个姓名

key就是函数依赖的特殊情况,函数依赖是普遍存在的

image-20240408193649106

但是有一种没有任何意义的、普遍存在的函数关系我们就称为trivial,我们一般不考虑这玩意儿

image-20240408193913382

Closure(闭包)

of a Set of Functional Dependencies

一个关系模式里面,有重叠的函数依赖可以推出新的函数依赖。

函数依赖——包含被推导出的函数依赖中,所有 同一个起点的 的集合,就是这个起点的 闭包。

image-20240408194254463

下面有三条公理用于推演F+的成员

image-20240408194627216

自反律就是刚刚的trivial

第二个\(\gamma \alpha\)是并在一起的意思

推演例子(简单)

image-20240408195601327

由公理可推导更多的定理

image-20240408195731393

练习1

看一下,不会做,别看答案

image-20240408195939920

of Attribute Sets

就能通过关系依赖被A决定的属性,包括A本身,组成的集合就是A的闭包

image-20240408200444264

和上面的区别就是集合元素变成了属性,简洁很多

获取属性闭包的算法

image-20240408200548290

其实画 单向图(Graph)就行了

image-20240408200703265

Canonical Cover(正则覆盖)

怎么求??

刚刚说的闭包是尽可能列出所有的即便会重叠的函数依赖

正则覆盖则反过来化简,类似线性代数基的概念,在函数依赖中找到最小的、但是却可以确定所有函数依赖的集合

image-20240408201519247

下面是具体定义:

image-20240408201602722

注意要求左式只能为单

Exercise 2

image-20240408201941760

Boyce-Codd Normal Form

之前也说了就是只有一个key

用函数依赖来定义就是,这个关系模式所有的函数依赖,要不是左边是key的,要不就是trivial(频繁)的

image-20240408202809028

BCNF是数据库设计的基本目标

Decomposing a Schema into BCNF

分解必须是无解的

分解算法

image-20240408202940541

就是,如果目前的result里面有非BCNF的,就在这个schema里面找一个函数依赖\(\alpha \rightarrow \beta\),它的左边$\alpha $不是key

然后将这个schema分为两个新的schema,一个只包含\(\alpha\)\(\beta \(,一个去掉\)\beta\),但不去掉\(\alpha\),作为公共属性。前者的key正好是\(\alpha\)

Exercise 3

image-20240408203607946

Dependency Preservation(依赖保持)

原来每一条函数依赖都能在被分解后的任意一个表上得到验证,那么就称这个分解是满足依赖保持的

注意是单独的在每一个表里面能够检验所有的依赖保持

image-20240409101441558

Exercise 4

image-20240408204334340

Third Normal Form: Motivation

满足第二范式基础,且消除对主属性的传递依赖。

有一张表 R (学号,课程号,成绩,姓名, 老师,老师职称)

我们可以发现(学号,课程号)之所以能决定教师职称并不是直接得出来的,是因为我们先由此推出老师是谁,才知道教师职称。

即X(学号,课程号)→Y(教师),Y(教师)→Z (教师职称) 导致的X(学号,课程号)→Z(教师职称)。

我们称教师职称是传递依赖于(学号,课程号)。

存在传递依赖也有弊端,比如:

老师职称改变了,要修改很多条数据。(修改异常)

没人选某个老师的课时候,该老师的职称记录就会被全部删除。(删除异常)

新来老师还没有定教哪门课,教师职称不知该保存到什么地方。(插入异常)

所以,我们必须消除传递依赖。具体做法就是消除传递依赖的非主属性:

学号,课程号,成绩,教师)

教师,教师职称)

任何一条函数依赖,要么是频繁的,要么左边是key,要么右边的属性包含在某个candidate key里面

显然是BCNF弱化的版本,多了个右边的性质

image-20240409102434182