欢迎来到关系型数据库的世界!
你有没有想过 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 是我们与数据库沟通的语言。它让我们能够搜索、新增或删除数据。
四大指令:
- SELECT: 你想看到哪些字段?
- FROM: 你要搜索哪个数据表?
- WHERE: 搜索条件是什么?(就像滤网一样)。
- 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 查询吧!