数据库系统原理-函数依赖和关系模式分解
目录
学习本章相关理论知识可以为优化我们设计的数据库模型
第一范式
如果某个域中元素被认为是不可分的,则这个域称为是原子的
非原子域的例子:
- 复合属性:名字集合
- 多值属性:电话号码
- 复杂数据类型:面向对象的
如果关系模式R的所有属性的域都是原子的,则R称为属于第一范式
(1NF)
非原子值存储复杂并易导致数据冗余,在数据库系统中我们创建的表基本都属于第一范式
如何处理非原子值
- 对于组合属性:让每个子属性本身成为一个单独的属性
- 对于多值属性:为多值集合中的每个项创建一条元组(再建表)
原子性
原子性实际上是由域元素在数据库中如何被使用决定的
例如,字符串通常会被认为是不可分割的,假设学生被分配这样的标识号:CS0012或SE1127,如果前两个字母表示系,后四位数字表示学生在该系内的唯一号码,则这样的标识号不是原子的(字符串+数字)
当采用这种标识号时,是不可取的。因为这需要额外的编程,而且信息是在应用程序中而不是在数据库中编码
关系数据库设计中易犯的错误
关系数据库设计要求我们找到一个好的关系模式集合。一个坏的
设计可能导致以下问题
- 数据冗余
- 插入、删除、修改异常
假设,我们用以下模式代替instructor模式和department模式:
inst_dept(ID, name, salary, dept_name, building, budget)
这样的关系模式存在以下问题
- 数据冗余
- 更新异常
更新复杂,容易导致不一致问题。例,修改dept_name,很多相关元组都需要修改
- 插入/删除异常
使用空值(null):存储一个不知道所在系的教师信息,可以使用空值表示dept_name, building, budget数据,但是空值难以处理
模式分解
例:可以将关系模式(A,B,C,D)分解为:(A,B)和(B,C,D),或(A,C,D)和
(A,B,D),或(A,B,C)和(C,D),或(A,B)、(B,C)和(C,D),或 (A,D)和
(B,C,D)
例:将关系模式inst_dept分解为:
― *instructor*(*ID