数据库规范化

你好,有抱负的数据库爱好者们!今天,我们将踏上一段激动人心的旅程,探索数据库规范化的世界。作为你友好的计算机科学老师,我很高兴引导你学习数据库设计中这个基本概念。如果你是编程新手,不用担心——我们将从基础开始,逐步深入!

DBMS - Database Normalization

数据库规范化简介

想象一下你在整理衣柜。你不会把所有的衣服都扔进一个大堆里,对吧?当然不会!你会按类型、颜色或季节来分类。数据库规范化与此类似——都是关于高效地组织数据并减少冗余。

函数依赖

让我们从基本概念开始:函数依赖。

什么是函数依赖?

函数依赖(FD)是关系中两个属性之间的关系,其中一个属性决定了另一个属性。

想象你有一个学生数据库:

学生ID 姓名 年龄 课程
101 Alice 20 数学
102 Bob 21 物理
103 Charlie 19 化学

在这里,学生ID函数性地决定了姓名、年龄和课程。我们将其写作:

学生ID → 姓名, 年龄, 课程

这意味着如果我们知道学生ID,我们就可以确定学生的姓名、年龄和课程。

Armstrong的公理

现在,让我们来谈谈Armstrong的公理。这些是函数依赖的基本规则。可以将其视为数据库关系的“物理定律”!

  1. 反身性:如果Y是X的子集,那么X → Y
  2. 增广性:如果X → Y,那么XZ → YZ
  3. 传递性:如果X → Y且Y → Z,那么X → Z

这些听起来可能很复杂,但它们只是描述逻辑关系的正式方式。我们将在接下来的学习中看到它们的应用!

显微函数依赖

当一个右侧属性是左侧属性的子集时,存在一个显微函数依赖。例如:

学生ID, 姓名 → 学生ID

这是显而易见的,因为知道学生ID和姓名总是能告诉你学生ID(它已经在那里了!)。

规范化

现在,让我们深入到我们课程的中心:规范化。规范化是组织数据以最小化冗余和依赖的过程。这就像在清理你的数据库!

第一范式(1NF)

第一范式是规范化的基本级别。为了达到1NF:

  1. 消除重复组
  2. 为每组相关数据创建单独的表
  3. 用主键标识每组相关数据

让我们看一个例子:

1NF之前:

订单ID 产品 数量
1 苹果, 香蕉 2, 3
2 橙子, 葡萄 1, 4

1NF之后:

订单ID 产品 数量
1 苹果 2
1 香蕉 3
2 橙子 1
2 葡萄 4

看,我们消除了重复组,变得更加整洁!

第二范式(2NF)

为了达到2NF,我们需要:

  1. 符合1NF
  2. 移除部分依赖

让我们看一个例子:

学生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,我们需要:

  1. 符合2NF
  2. 移除传递依赖

让我们看一个例子:

员工ID 部门 部门主管
101 销售 John
102 市场营销 Sarah

在这里,部门主管依赖于部门,而部门依赖于员工ID。我们应该将其分开:

表1:员工

员工ID 部门
101 销售
102 市场营销

表2:部门

部门 部门主管
销售 John
市场营销 Sarah

Boyce-Codd范式(BCNF)

BCNF是3NF的一个稍微更强的版本。为了达到BCNF:

  1. 符合3NF
  2. 对于每一个依赖X → Y,X应该是超键

这里有一个例子:

学生 科目 教授
Alice 数学 Smith教授
Bob 物理 Johnson教授

在这种情况下,(学生, 科目) → 教授 和 教授 → 科目。为了达到BCNF,我们将其分开:

表1:学生_教授

学生 教授
Alice Smith教授
Bob Johnson教授

表2:教授_科目

教授 科目
Smith教授 数学
Johnson教授 物理

就这样!我们已经涵盖了数据库规范化的基础知识。记住,虽然规范化很重要,但有时为了性能考虑,反规范化可能是有用的。一切都取决于你特定需求的平衡。

我希望这个指南对你有所帮助。记住,熟能生巧!尝试在你自己的一些样本数据库上实践规范化。如果你有任何问题,不要犹豫,随时提问。快乐规范化!

Credits: Image by storyset