数据库规范化
你好,有抱负的数据库爱好者们!今天,我们将踏上一段激动人心的旅程,探索数据库规范化的世界。作为你友好的计算机科学老师,我很高兴引导你学习数据库设计中这个基本概念。如果你是编程新手,不用担心——我们将从基础开始,逐步深入!
数据库规范化简介
想象一下你在整理衣柜。你不会把所有的衣服都扔进一个大堆里,对吧?当然不会!你会按类型、颜色或季节来分类。数据库规范化与此类似——都是关于高效地组织数据并减少冗余。
函数依赖
让我们从基本概念开始:函数依赖。
什么是函数依赖?
函数依赖(FD)是关系中两个属性之间的关系,其中一个属性决定了另一个属性。
想象你有一个学生数据库:
学生ID | 姓名 | 年龄 | 课程 |
---|---|---|---|
101 | Alice | 20 | 数学 |
102 | Bob | 21 | 物理 |
103 | Charlie | 19 | 化学 |
在这里,学生ID函数性地决定了姓名、年龄和课程。我们将其写作:
学生ID → 姓名, 年龄, 课程
这意味着如果我们知道学生ID,我们就可以确定学生的姓名、年龄和课程。
Armstrong的公理
现在,让我们来谈谈Armstrong的公理。这些是函数依赖的基本规则。可以将其视为数据库关系的“物理定律”!
- 反身性:如果Y是X的子集,那么X → Y
- 增广性:如果X → Y,那么XZ → YZ
- 传递性:如果X → Y且Y → Z,那么X → Z
这些听起来可能很复杂,但它们只是描述逻辑关系的正式方式。我们将在接下来的学习中看到它们的应用!
显微函数依赖
当一个右侧属性是左侧属性的子集时,存在一个显微函数依赖。例如:
学生ID, 姓名 → 学生ID
这是显而易见的,因为知道学生ID和姓名总是能告诉你学生ID(它已经在那里了!)。
规范化
现在,让我们深入到我们课程的中心:规范化。规范化是组织数据以最小化冗余和依赖的过程。这就像在清理你的数据库!
第一范式(1NF)
第一范式是规范化的基本级别。为了达到1NF:
- 消除重复组
- 为每组相关数据创建单独的表
- 用主键标识每组相关数据
让我们看一个例子:
1NF之前:
订单ID | 产品 | 数量 |
---|---|---|
1 | 苹果, 香蕉 | 2, 3 |
2 | 橙子, 葡萄 | 1, 4 |
1NF之后:
订单ID | 产品 | 数量 |
---|---|---|
1 | 苹果 | 2 |
1 | 香蕉 | 3 |
2 | 橙子 | 1 |
2 | 葡萄 | 4 |
看,我们消除了重复组,变得更加整洁!
第二范式(2NF)
为了达到2NF,我们需要:
- 符合1NF
- 移除部分依赖
让我们看一个例子:
学生ID | 课程ID | 课程名称 | 教授 |
---|---|---|---|
101 | C1 | 数学 | Smith教授 |
102 | C2 | 物理 | Johnson教授 |
在这里,课程名称和教授依赖于课程ID,而不是学生ID。我们应该将其分成两个表:
表1:学生_课程
学生ID | 课程ID |
---|---|
101 | C1 |
102 | C2 |
表2:课程
课程ID | 课程名称 | 教授 |
---|---|---|
C1 | 数学 | Smith教授 |
C2 | 物理 | Johnson教授 |
第三范式(3NF)
为了达到3NF,我们需要:
- 符合2NF
- 移除传递依赖
让我们看一个例子:
员工ID | 部门 | 部门主管 |
---|---|---|
101 | 销售 | John |
102 | 市场营销 | Sarah |
在这里,部门主管依赖于部门,而部门依赖于员工ID。我们应该将其分开:
表1:员工
员工ID | 部门 |
---|---|
101 | 销售 |
102 | 市场营销 |
表2:部门
部门 | 部门主管 |
---|---|
销售 | John |
市场营销 | Sarah |
Boyce-Codd范式(BCNF)
BCNF是3NF的一个稍微更强的版本。为了达到BCNF:
- 符合3NF
- 对于每一个依赖X → Y,X应该是超键
这里有一个例子:
学生 | 科目 | 教授 |
---|---|---|
Alice | 数学 | Smith教授 |
Bob | 物理 | Johnson教授 |
在这种情况下,(学生, 科目) → 教授 和 教授 → 科目。为了达到BCNF,我们将其分开:
表1:学生_教授
学生 | 教授 |
---|---|
Alice | Smith教授 |
Bob | Johnson教授 |
表2:教授_科目
教授 | 科目 |
---|---|
Smith教授 | 数学 |
Johnson教授 | 物理 |
就这样!我们已经涵盖了数据库规范化的基础知识。记住,虽然规范化很重要,但有时为了性能考虑,反规范化可能是有用的。一切都取决于你特定需求的平衡。
我希望这个指南对你有所帮助。记住,熟能生巧!尝试在你自己的一些样本数据库上实践规范化。如果你有任何问题,不要犹豫,随时提问。快乐规范化!
Credits: Image by storyset