欢迎来到关系型数据库的世界!

你有没有想过 Amazon 是如何记住你的过往订单,或者你的学校是如何在不混乱的情况下,管理成千上万名学生、成绩以及老师的资料?其中的秘诀就是关系型数据库(Relational Database)

在本章中,我们将学习如何组织数据,使其保持准确、易于搜索,并尽可能节省存储空间。如果一开始觉得内容有点“硬核”也别担心——我们会把它拆解成简单的小步骤,让你轻松掌握!

1. 什么是关系型数据库?

你可以把关系型数据库想象成一套相互连接的数字档案柜(称为数据表 Tables)。与其把每一项信息都塞进一个巨大、混乱的电子表格里,我们将其拆分成较小且井然有序的数据表。

你需要知道的关键术语:

  • 关系 (Relation): 这是数据表 (Table) 的正式名称。
  • 属性 (Attribute): 字段标题。例如:学生姓名 (StudentName)出生日期 (DateOfBirth)
  • 元组 (Tuple): 这是记录 (Record) 的专业术语(数据表中的单一行)。
  • 域 (Domain): 属性允许值的集合(例如:“年级”的域可能是 1 到 10)。

类比: 想象一所学校。我们有一个学生数据表,另一个是课程数据表。我们将它们“关联”起来,这样就能知道哪个学生选了哪门课,而不需要重复输入五次学生的地址!

快速回顾:

关系型数据库通过链接多个数据表来减少冗余 (Redundancy)(即重复输入相同的数据)。

2. 键 (Keys):数据库的“身份证”

为了将不同的数据表链接起来,我们需要称为键 (Keys) 的特殊字段。

主键 (Primary Key)

主键是数据表中每一笔记录的唯一标识码。数据表中没有两行可以拥有相同的主键。
例子:你的学生编号或汽车的车牌号码。

外键 (Foreign Key)

外键是指一个数据表中的主键,它出现在另一个数据表中,用来将两者链接起来。

复合键 (Composite Key)

有时,单一字段不足以成为唯一标识码。复合键是由两个或多个字段组合而成的特殊主键。

记忆小撇步:
Primary(主键) = Personal(个人的,是我独有的 ID)。
Foreign(外键) = Friend(朋友的,是来自另一个数据表的朋友 ID)。

3. 实体关系 (ER) 模型

在建立数据库之前,我们会绘制一张图表,称为实体关系图 (Entity-Relationship Diagram, ERD)实体 (Entity) 就是我们想要存储数据的“事物”(例如:学生、老师或书籍)。

关系类型:

  • 一对一 (1:1): 一个丈夫拥有一位妻子(通常情况下!)。
  • 一对多 (1:M): 一位母亲可以有多个孩子。这是最常见的类型。
  • 多对多 (M:M): 许多学生修读许多科目。注意:数据库非常讨厌“多对多”关系;我们通常会将其拆解成更小的数据表!

你知道吗? 在 ER 图中,我们常使用“乌鸦脚 (Crow's Foot)”标记法。带有三个小“脚趾”的一端代表关系中的“多”方!

4. 规范化 (Normalisation):清理混乱

规范化是组织数据的过程,目的是减少冗余(重复)并提升数据完整性 (Data Integrity)(准确性)。我们分为三个阶段来执行。

第一范式 (1NF)

当满足以下条件时,数据表即达到 1NF:
1. 没有“重复的属性组”。
2. 所有数据格都是原子的 (Atomic)(这意味着你无法再拆分这些数据)。
例子:你不应该在一个格子里写“足球, 西洋棋”。它们应该分开在不同的行中。

第二范式 (2NF)

当满足以下条件时,数据表即达到 2NF:
1. 已经符合 1NF。
2. 没有部分函数依赖 (Partial Dependencies)。这意味着每个非键属性都必须完全依赖于整个主键(仅当你拥有复合键时才需要考虑)。

第三范式 (3NF)

当满足以下条件时,数据表即达到 3NF:
1. 已经符合 2NF。
2. 没有传递函数依赖 (Transitive Dependencies)
黄金法则: 每个属性都必须依赖于“键、整个键,且除此以外无其他!”

常见错误: 学生常忘记 3NF 的前提是数据表必须先达到 2NF。这就像爬梯子一样——你不可能不经过前两阶就直接到达第三阶!

5. 结构化查询语言 (SQL)

SQL 是我们与数据库沟通的语言。它让我们能够搜索、新增或删除数据。

四大指令:

  1. SELECT: 你想看到哪些字段?
  2. FROM: 你要搜索哪个数据表?
  3. WHERE: 搜索条件是什么?(就像滤网一样)。
  4. ORDER BY: 你想按字母或数字顺序排列结果吗?
SQL 查询示例:
找出所有得分高于 80 分的学生姓名:

SELECT StudentName
FROM StudentTable
WHERE TestScore > 80
ORDER BY StudentName ASC

小撇步: 如果你想选取数据表中的所有字段,请使用星号 *
\(SELECT * FROM Students\)

总结检查清单

你能向朋友解释这些概念吗?
- 元组 (Tuple)属性 (Attribute) 之间的区别。
- 为什么主键 (Primary Key) 必须是唯一的。
- 外键 (Foreign Key) 如何链接两个数据表。
- 规范化 (Normalisation) 的三个阶段。
- 如何编写基本的 SELECT 语句。

做得好!数据库可能会比较棘手,因为它需要非常有组织的思考方式,但一旦你掌握了“键”和“规范化”,剩下的就只是简单的逻辑了。继续练习那些 SQL 查询吧!