数据模型到数据库设计的转换
立即解锁
发布时间: 2025-08-23 01:01:57 阅读量: 5 订阅数: 11 


数据库处理:从理论到实践的全面指南
# 数据模型到数据库设计的转换
## 1. 弱非ID依赖实体的关系
在数据模型中,强实体与弱但非ID依赖实体之间的关系,和两个强实体之间的关系表现一致,属于非标识关系,且由最大基数来表征。此前关于强实体间1:1、1:N和N:M关系的讨论,同样适用于强实体与弱非ID依赖实体间的关系。
以CLASS和SECTION为例,下面展示了从数据模型到数据库设计的转换:
| 数据模型 | 数据库设计 |
| --- | --- |
| CLASS:ClassName, NumberHours, Description <br> SECTION:ClassName, SectionNumber, ClassDays, Time, Professor | CLASS:ClassName, NumberHours, Description <br> SECTION:ClassName (FK), SectionNumber, ClassDays, Time, Professor |
当ID依赖实体的父实体标识符被替代键替换时,会产生一些问题。例如,BUILDING和APARTMENT,APARTMENT的标识符是公寓号和建筑标识符的组合。若BUILDING的标识符为(Street, City, State/Province, Country),那么APARTMENT的标识符就是(Street, City, State/Province, Country, ApartmentNumber)。可以用替代键BuildingID替换BUILDING的长标识符,但此时APARTMENT的键变为(BuildingID, ApartmentNumber),这个组合对用户来说没有实际意义。为改进设计,当用替代键替换ID依赖实体的父实体标识符时,应将ID依赖实体的标识符也替换为其自身的替代键,得到的表将是弱但非ID依赖的。
## 2. 混合实体设计中的关系
混合实体模式的设计是强实体和ID依赖实体设计的组合。以员工和技能为例,EMPLOYEE_SKILL依赖于EMPLOYEE,但与SKILL是非标识关系。
### 数据模型
- EMPLOYEE:EmployeeNumber, EmployeeName, Phone, EmailAddress, HireDate, ReviewDate, EmpCode
- SKILL:SkillName, Description, SalaryRange
- EMPLOYEE_SKILL:EmployeeNumber, SkillNumber, ProficiencyLevel, CourseTaken
### 数据库设计
- EMPLOYEE:EmployeeNumber, EmployeeName, Phone, EmailAddress, HireDate, ReviewDate, EmpCode
- SKILL:SkillName, Description, SalaryRange
- EMPLOYEE_SKILL:EmployeeNumber (FK), SkillNumber, ProficiencyLevel, CourseTaken, SkillName (FK)
在这个设计中,EmployeeNumber既是EMPLOYEE_SKILL主键的一部分,也是指向EMPLOYEE的外键;SKILL和EMPLOYEE_SKILL之间的1:N非标识关系通过将SKILL的键SkillName放在EMPLOYEE_SKILL中来表示,且EMPLOYEE_SKILL.SkillName是外键但不是主键的一部分。
转换SALES_ORDER数据模型时,ID依赖表ORDER_LINE_ITEM的SalesOrderNumber既是主键的一部分,也是外键,ItemNumber只是外键。
### 总结
所有HAS - A关系的设计转换过程可以总结为“将父实体的主键作为外键放在子实体中”:
- 对于强实体的1:1关系,任何一个实体都可以作为父实体,外键可以放在任意一个表中。
- 对于1:N关系,父实体的主键作为外键放在子实体中。
- 对于N:M关系,通过定义一个交叉表将模型分解为两个1:N关系,并将父实体的主键作为外键放在子实体中。
- 对于标识关系,父实体的主键已经在子实体中,无需额外操作。
- 对于混合关系,在标识侧,父实体的主键已经在子实体中;在非标识侧,将父实体的主键放在子实体中。
## 3. 超类型和子类型实体之间的关系
超类型实体与其子类型之间的关系也称为IS - A关系,因为子类型和其超类型是同一底层实体的不同表示。例如,MANAGER(子类型)是EMPLOYEE(超类型),SALESCLERK(子类型)也是EMPLOYEE(超类型)。所以,所有子类型表的键与超类型表的键相同。
以STUDENT的两个子类型UNDERGRADUATE和GRADUATE为例:
### 数据模型
- STUDENT:StudentID, LastName, FirstName, isGradStudent
- UNDERGRADUATE:StudentID, HighSchoolGPA, ScoreOnSAT
- GRADUATE:StudentID, UndergraduateGPA, ScoreOnGMAT
### 数据库设计
- STUDENT:StudentID, LastName, FirstName, isGradStudent
- UNDERGRADUATE:StudentID (FK), HighSchoolGPA, ScoreOnSAT
- GRADUATE:StudentID (FK), UndergraduateGPA, ScoreOnGMAT
需要注意的是,区分属性(如isGradStudent)在关系设计中无法表示,只能在设计文档中注明其用于确定子类型,应用程序需要编写代码来使用该属性确定特定STUDENT所属的子类型。
## 4. 递归关系
递归关系的表示是表示强实体间关系技术的扩展,虽然初次理解可能有难度,但涉及的原理是已经学过的。
### 4.1 1:1递归关系
以1:1递归的BOXCAR关系为例,为表示该关系,在BOXCAR中创建一个外键,包含后面车厢的标识符。由于是1:1关系,将外键定义为唯一(这里显示为备用键),以确保一个车厢最多只有一个后面的车厢。
```mermaid
graph LR
A[BOXCAR] -->|BoxCarNumberBehind (FK)| A
```
### 4.2 1:N递
0
0
复制全文
相关推荐










