欢迎来到数据库的世界!

你有没有想过 Spotify 是如何追踪数以百万计的歌曲,或者学校是如何管理成千上万名学生的数据而不丢失任何记录的呢?秘密就在于数据库 (Databases)!在本章中,我们将学习如何整理信息,使其易于搜索、更新并确保其安全性。如果一开始觉得术语很多也不用担心;只要把数据库想象成一个非常聪明的数字档案柜就可以了。


1. 构建基础:数据表、记录与字段

在建立复杂系统之前,我们需要先了解关系型数据库 (Relational Database) 的基本结构。

数据库由什么组成?

想象一下班级名单的电子表格:

  • 数据表 (Table): 关于特定主题的完整数据集合(例如:“学生”数据表)。
  • 记录 (Record 或 Row): 单一水平条目。它代表一个“个体”(例如:某位特定的学生)。
  • 字段 (Field 或 Column): 单一垂直类别。它代表一个“属性”或特征(例如:“电话号码”或“出生日期”)。
  • 属性 (Attribute): 这只是字段的另一个名称。它描述了实体的一种特性。

快速复习: 如果你有一张“图书”数据表,作者就是一个字段,而《哈利波特:神秘的魔法石》则是某条记录的一部分。


2. 数据库的“键”(Keys)

在数据库中,我们需要通过某些方式来识别数据并链接不同的数据表,我们称之为键 (Keys)

键的类型

  • 主键 (Primary Key): 每条记录的唯一标识符。没有两条记录可以拥有相同的主键。例如:你的学号或身份证号码。
  • 复合键 (Composite Key): 当单个字段不足以成为唯一标识符时,我们会结合两个或多个字段来组成。例如:结合“课程编号”与“学生编号”来识别特定的选修记录。
  • 外键 (Foreign Key): 数据表中的一个字段,它是另一个数据表中的主键。这是我们用来“链接”数据表的方式。
  • 次要键 (Secondary Key): 不是主键,但经常被用于搜索数据的字段。例如:不使用学号,而是以“姓氏”来搜索学生。

记忆小撇步: 可以把主键想象成你的指纹(对你而言是独一无二的),而外键则像是一封推荐信(它指向另一个人)。


3. 数据冗余与依赖性

一个好的数据库应该是“精简有效”的。我们需要避免两个大问题:

数据冗余 (Data Redundancy)

当相同的数据存放在多个地方时,就会发生这种情况。例如:将学生的住址写在五个不同的数据表中。
为什么这很糟糕? 它不仅浪费存储空间,还会导致“更新异常 (Update Anomalies)”——如果学生搬家了,你可能忘记在五个地方同时更新,导致数据不一致。

数据依赖性 (Data Dependency)

这指的是字段之间的关系。我们希望字段依赖于主键。如果某项信息(例如“医生的电话号码”)依赖于主键以外的其他东西(例如“医生的姓名”),当数据被删除或更改时,就会造成混乱。

关键总结: 我们要减少冗余,以确保数据准确并节省空间!


4. 规范化:打造完美数据库的三个步骤

规范化 (Normalization) 是通过整理数据库来减少冗余的过程。对于 H2 Computing 课程,你需要知道如何将数据表达到第三规范化 (3NF)

逐步流程

  1. 第一规范化 (1NF): 移除“重复组”。每个单元格必须只包含一个单一值(原子值)。格子里不准出现列表!
  2. 第二规范化 (2NF): 必须先达到 1NF。接着,移除部分依赖 (Partial Dependencies)。这意味着每个字段必须依赖于整个主键(这通常只有在你拥有复合键时才会成为问题)。
  3. 第三规范化 (3NF): 必须先达到 2NF。接着,移除传递依赖 (Transitive Dependencies)。这意味着“非键字段不应依赖于其他非键字段”。

记忆口诀: 要达到 3NF,字段必须依赖:“主键 (1NF)、整个主键 (2NF),以及除了主键之外什么都不依赖 (3NF),上帝保佑 Codd!”(E.F. Codd 是这套系统的发明者)。


5. 实体关系图 (ER Diagrams)

ER 图是用来呈现数据表之间如何关联的地图。它使用方框与线条来表示链接。

  • 实体 (Entity): 用矩形表示(例如:[学生])。
  • 关系 (Relationship): 它们之间的连线。

常见的关系类型

  • 一对一 (1:1): 一个人只有一本护照。
  • 一对多 (1:M): 一位母亲可以有多个孩子。(这是数据库中最常见的!)
  • 多对多 (M:N): 许多学生修读许多科目。注意:在实际数据库中,我们通常会使用“链接数据表”将其拆解为两个 1:M 的关系。

6. SQL:与数据库沟通

结构化查询语言 (SQL) 是我们用来“向数据库索取”信息或进行修改的语言。

必要的 SQL 指令

  • SELECT: 用于选择你想要查看的字段。
  • FROM: 数据来自哪个数据表。
  • WHERE: 过滤数据(像是一种“搜索”条件)。
  • ORDER BY: 排序结果(ASC 为递增,DESC 为递减)。
  • INSERT INTO: 新增一条记录。
  • UPDATE: 修改现有数据。
  • DELETE: 删除记录。
  • JOIN: 根据相关字段合并两个或多个数据表的数据行。

查询示例:
SELECT Name, Score FROM Students WHERE Score > 70 ORDER BY Score DESC;
(这会显示所有分数高于 70 分的学生姓名与分数,并按分数从高到低排列。)


7. SQL vs. NoSQL:现代选择

传统数据库使用 SQL 和严格的数据表。但有时数据过于混乱或变动太快,这时 NoSQL 就派上用场了。

两者比较

SQL (关系型):

  • 使用具有行和列的结构化数据表。
  • 非常适合数据“形状”不常改变的场景(例如:银行账户)。
  • 强一致性(数据在系统中永远保持准确)。

NoSQL (非关系型):

  • 解决了如扩展性 (Scaling) 等短处(NoSQL 可以轻松处理跨多个服务器的海量数据)。
  • 灵活的“架构”(Schema)(不需要固定的数据表;数据可以存储为文档、图形或键值对)。
  • 非常适合“大数据”和即时 Web 应用(例如:社交媒体动态墙)。

你知道吗? SQL 数据库就像一座图书馆(组织严谨,每样东西都有特定位置),而 NoSQL 就像一个洗衣篮(容易快速丢入物品,灵活弹性,但寻找东西时需要不同的方式)。


8. 在 Python 中操作数据库

在实作考试中,你很可能会使用 Python 中的 sqlite3 模块来操作 SQL 数据库。

Python-SQL 工作流程

  1. 连接 (Connect): 建立与数据库文件的连接。
  2. 游标 (Cursor): 建立一个“游标”对象(把它想象成执行指令的数字“指针”)。
  3. 执行 (Execute): 使用 cursor.execute("SQL 指令")
  4. 提交 (Commit): 使用 connection.commit() 来保存你的变更!
  5. 关闭 (Close): 完成后务必关闭连接。

常见错误: 忘记提交 (commit)!如果你不提交,你的 INSERTUPDATE 指令就不会保存到文件中,到时候你就会纳闷数据怎么消失了!


快速复习箱

主键 (Primary Key): 唯一 ID。
外键 (Foreign Key): 链接到另一个数据表。
规范化 (Normalization): 减少数据重复(冗余)。
1NF: 单元格内没有列表。
2NF: 没有部分依赖。
3NF: 没有传递依赖。
SQL: 数据库的语言。
NoSQL: 灵活,比 SQL 更擅长处理“大数据”。