关系数据库设计:原理、范式与分解策略
立即解锁
发布时间: 2025-08-23 01:16:45 阅读量: 4 订阅数: 17 

# 关系数据库设计:原理、范式与分解策略
## 1. 良好关系设计的特点
实体 - 关系(E - R)设计为创建关系数据库设计提供了很好的起点。可以直接从 E - R 设计生成一组关系模式,而这些模式的优劣取决于 E - R 设计的质量。以下是大学数据库的模式:
| 模式名称 | 包含属性 |
| --- | --- |
| classroom | building, room number, capacity |
| department | dept name, building, budget |
| course | course id, title, dept name, credits |
| instructor | ID, name, dept name, salary |
| section | course id, sec id, semester, year, building, room number, time slot id |
| teaches | ID, course id, sec id, semester, year |
| student | ID, name, dept name, tot cred |
| takes | ID, course id, sec id, semester, year, grade |
| advisor | s ID, i ID |
| time slot | time slot id, day, start time, end time |
| prereq | course id, prereq id |
### 1.1 设计方案:更大的模式
假设不使用 instructor 和 department 模式,而是使用 inst dept 模式:inst dept (ID, name, salary, dept name, building, budget)。这是 instructor 和 department 对应关系自然连接的结果,看似能减少某些查询的连接操作,但存在问题。
在 inst dept 关系实例中,每个部门的信息(“building” 和 “budget”)会为该部门的每个教师重复记录。例如,计算机科学系的信息(Taylor, 100000)会在 Katz、Srinivasan 和 Brandt 教师的元组中重复。这会导致预算金额的冗余存储,并且可能因用户更新不一致而造成数据库的不一致。
此外,当创建新部门时,如果该部门没有教师,就无法直接表示部门信息(dept name, building, budget),因为 inst dept 表的元组需要 ID、name 和 salary 值。在原设计中,department 模式可以处理这种情况,而在修改后的设计中,可能需要创建包含空值的元组。
### 1.2 设计方案:更小的模式
如果最初使用 inst dept 模式,如何识别它需要拆分呢?通过观察 inst dept 模式的实际关系内容,可以发现部门信息的重复,但这种方法不可靠。因为实际数据库的模式和属性众多,元组数量可能达数百万甚至更多,发现重复信息的成本很高,而且无法确定不重复是特殊情况还是普遍规则。
为了解决这个问题,需要了解企业规则。例如,在大学组织中,每个部门(由 dept name 标识)必须位于一个建筑中且有一个预算金额。可以通过指定功能依赖 dept name → budget 来表示这种规则。
并非所有模式分解都是有益的。例如,将 employee 模式(ID, name, street, city, salary)分解为 employee1 (ID, name) 和 employee2 (name, street, city, salary),可能会因为企业中存在同名员工而导致信息丢失。这种分解被称为有损分解,而不会导致信息丢失的分解称为无损分解。
## 2. 原子域和第一范式
E - R 模型允许实体集和关系集具有一定子结构的属性,如多值属性和复合属性。在从包含这些属性的 E - R 设计创建表时,需要消除这种子结构。
在关系模型中,属性没有子结构。如果域的元素被视为不可分割的单位,则该域是原子的。如果关系模式 R 的所有属性的域都是原子的,则称 R 处于第一范式(1NF)。
以下是一些非原子值的例子:
- 名称集合:如果关系 employee 的模式包含一个 children 属性,其域元素是名称集合,则该模式不处于第一范式。
- 复合属性:如地址属性(包含 street、city、state 和 zip 等组件属性)也具有非原子域。
整数通常被认为是原子的,但整数集合是非原子的。重要的是如何在数据库中使用域元素。例如,组织分配的员工识别号(如 “CS001”)可以分解为更小的单位,因此是非原子的。如果关系模式的属性域包含此类识别号,则该模式不处于第一范式。
然而,大学模式中的课程标识符(如 “CS - 101”),只要数据
0
0
复制全文
相关推荐










