数据库表的规范化与设计
立即解锁
发布时间: 2025-08-23 00:32:14 阅读量: 5 订阅数: 18 


数据库系统:设计、实现与管理的核心概念
### 数据库表的规范化与设计
#### 1. 赋值表的自动化与安全性
在数据库操作中,赋值表(ASSIGNMENT)的部分属性值可由应用程序自动生成。例如,`ASSIGN_NUM` 可通过计数器创建,`ASSIGN_DATE` 能是应用程序读取的系统日期,并自动录入到 `ASSIGNMENT` 表中。同时,应用软件可将 `JOB` 表中合适的 `JOB_CHG_HOUR` 值写入 `ASSIGNMENT` 表,实现 `ASSIGN_CHG_HOUR` 值的自动插入。若 `JOB` 表的 `JOB_CHG_HOUR` 值改变,下次插入到 `ASSIGNMENT` 表时会自动反映该变化,这种表结构减少了人工干预。
若系统要求员工录入自己的工作时长,他们可使用磁卡读卡器将 `EMP_NUM` 扫描到 `ASSIGNMENT` 表中,以此确认身份。所以,`ASSIGNMENT` 表的结构为维持一定的安全级别奠定了基础。
#### 2. 代理键的考量
尽管数据库设计满足关键的实体完整性和引用完整性要求,但设计者仍需关注一些问题。复合主键可能随属性数量增加而变得难以使用,创建合适的外键会更困难,编写搜索例程也会更复杂。有时主键属性的描述内容过多而无法使用,因此在 `JOB` 表中添加了 `JOB_CODE` 作为主键。
当主键不合适时,设计者会使用代理键。在实现层面,代理键是系统定义的属性,通常由数据库管理系统(DBMS)创建和管理,一般为数字类型,且每行新记录的值会自动递增。例如,Microsoft Access 使用 `AutoNumber` 数据类型,Microsoft SQL Server 使用标识列,Oracle 使用序列对象。
然而,`JOB_CODE` 作为主键无法防止重复录入,如下表所示:
| JOB_CODE | JOB_DESCRIPTION | JOB_CHG_HOUR |
| --- | --- | --- |
| 511 | Programmer | $35.75 |
| 512 | Programmer | $35.75 |
这些数据录入虽未违反实体完整性和引用完整性,但存在重复记录问题。若 `JOB_CODE` 作为代理主键,需通过唯一索引确保 `JOB_DESCRIPTION` 值的唯一性。
其他表(如 `PROJECT`、`ASSIGNMENT` 和 `EMPLOYEE`)也存在类似限制。若用 `EMPLOYEE` 表的 `EMP_NUM` 作为主键,可能会为同一员工创建多条记录。为避免此问题,可对 `EMP_LNAME`、`EMP_FNAME` 和 `EMP_INITIAL` 创建唯一索引,但遇到同名员工时,可能需使用其他(最好是外部定义的)属性作为唯一索引的基础。
数据库设计常需权衡和专业判断,要在设计完整性和灵活性间找到平衡。例如,若想限制员工每天只能有一条 `ASSIGN_HOURS` 记录,可在 `ASSIGNMENT` 表的 `PROJ_NUM`、`EMP_NUM` 和 `ASSIGN_DATE` 上创建唯一索引,但从管理角度看,这可能并不理想,因为员工一天可能在一个项目上工作多次。此时,最佳解决方案或许是添加新的外部定义属性(如存根、凭证或票据编号)来确保唯一性,同时应定期进行数据审计。
#### 3. 更高范式
##### 3.1 博伊斯 - 科德范式(BCNF)
当表中的每个决定因素都是候选键时,该表处于博伊斯 - 科德范式(BCNF)。若表中只有一个候选键,3NF 和 BCNF 等价。BCNF 可视为 3NF 的特殊情况,多数表达到 3NF 后,使用相关技术可符合 BCNF 要求。
一个表可能处于 3NF 但不满足 BCNF。例如,存在非键属性决定键属性的情况,虽不违反 3NF,但不符合 BCNF 要求,因为 BCNF 要求表中的每个决定因素都是候选键。
假设有如下功能依赖:
- `A + B → C, D`
- `A + C → B, D`
- `C → B`
此结构有两个候选键 `(A + B)` 和 `(A + C)`,无部分依赖和传递依赖,但 `C → B` 使表不满足 BCNF 要求。要将其转换为同时满足 3NF 和 BCNF 的表结构,可先将主键改为 `A + C`,此时表因存在部分依赖 `C → B` 处于 1NF,再按标准分解程序操作。
以下是一个转换示例数据:
| STU_ID | STAFF_ID | CLASS_CODE | ENROLL_GRADE |
| --- | --- | --- | --- |
| 125 | 25 | 21334 | A |
| 125 | 20 | 32456 | C |
| 135 | 20 | 28458 | B |
| 144 | 25 | 27563 | C |
| 144 | 20 | 32456 | B |
此数据反映的结构为:
- `STU_ID + STAFF_ID → CLASS_CODE, ENROLL_GRADE`
- `CLASS_CODE → STAFF_ID`
该结构虽处于 3NF,
0
0
复制全文
相关推荐









