数据库设计方法学:创建出色数据库的蓝图!

同学们好!欢迎来到数据库设计的世界。想象一下,你就像一个建筑师,只不过你设计的不是建筑物,而是组织有序的系统来存储信息。一个好的设计至关重要!它能确保你的数据可靠、高效且易于使用。糟糕的设计?那就好比建了一间没有门的屋子——一团糟!

在这一章,我们将学习如何从零开始规划和构建数据库。我们会涵盖如何绘制数据蓝图(称为实体关系图,简称ER图)、如何整齐地组织数据(透过规范化过程),以及如何确保数据安全。不用担心听起来很复杂,我们会一步一步透过简单例子解析。准备好,一起来学习吧!


蓝图:实体关系图 (ER图)

在建造任何东西之前,你都需要一个计划。在数据库设计中,我们的计划就是实体关系图 (ERD或ER图)。它是一种可视化方式,展示我们需要存储哪些数据,以及不同数据片段之间如何互相连接。

ER图的构建基石

ER图有几个关键组成部分。一起来认识一下符号!

  • 实体 (Entity):我们想存储信息的人、地方、对象或概念。把它想成名词。例子:学生 (Student)、书本 (Book)、课程 (Course)。

  • 属性 (Attribute):实体的性质或特征。例子:一个学生有“学生姓名”,一本书有“书名”。

  • 键属性 (Key Attribute):能唯一识别一个实体的属性。这将成为主键 (Primary Key)。没有两个实体可以在此属性上拥有相同的值。例子:学生编号 (Student ID)。

  • 关系 (Relationship):两个或多个实体之间的连接方式。把它想成动词。例子:一个学生借阅 (borrows) 一本书。

ER图符号速查表

这些是考试中你必须知道的官方符号。请务必正确使用它们!

实体:一个长方形

属性:一个椭圆形

键属性:一个椭圆形,名称带有底线

关系:一个菱形


事物如何连接:关系的类型

ER图中间隔的连线,告诉我们关系的类型,这也称为基数 (cardinality)。它描述了一个实体的多少个实例可以与另一个实体的实例相关联。

1. 一对一 (1:1) 关系

实体A的一个实例仅连接到实体B的一个实例。

例子:在一所学校里,一位校长负责一所学校

2. 一对多 (1:M) 关系

实体A的一个实例可以连接到实体B的多个实例,但实体B的每个实例只连接到实体A的一个实例。

例子:一位老师可以在一个班级里教导多位学生

3. 多对多 (M:N) 关系

实体A的多个实例可以连接到实体B的多个实例,反之亦然。

例子:许多学生可以选修许多不同的课程。一个学生可以修读多个课程,而一个课程也可以有多个学生选修。


那些小线和圆圈又代表什么呢?参与限制

有时你会在连接到关系菱形的线段上看到额外的符号。这些符号告诉我们该关系是强制性还是可选性。

  • 强制参与 ( | ):实体必须参与该关系。这就像在说:“每个学生都必须修读至少一门课程。”

  • 可选参与 ( O ):实体不必参与该关系。这就像在说:“一位教授可以受雇于大学,但他可能正在休研究假,目前没有教授任何课程。”


重点回顾:关系

关系定义了数据如何互动的规则。正确地掌握基数 (1:1, 1:M, M:N) 是数据库设计中最重要的步骤之一!


创建ER图:逐步指南

让我们先为学校图书馆设计一个简单的数据库。场景是:“学生可以借阅多本书籍,而一本书也可以在不同时间被多个学生借阅。”

步骤1:识别实体 (名词)

主要事物是学生 (Student)书本 (Book)

步骤2:识别每个实体的属性

  • 对于学生 (Student)学生编号 (StudentID)、学生姓名 (StudentName)、班级 (Class)

  • 对于书本 (Book)书本编号 (BookID)、书名 (Title)、作者 (Author)

步骤3:识别主键

学生编号 (StudentID)唯一识别每个学生。书本编号 (BookID)唯一识别每本书。让我们把它们划上底线。

步骤4:确定关系 (动词)

学生借阅书本。所以,关系是借阅 (Borrows)

步骤5:确定基数

  • 一个学生可以借阅多本书吗?可以。

  • 一本书可以被多个学生借阅吗?可以 (随着时间推移)。

这是一个典型的多对多 (M:N) 关系。

步骤6:绘图!

你会绘制一个长方形代表“学生”,另一个代表“书本”,然后在中间绘制一个菱形代表“借阅”,并用线段连接它们。在实体周围添加椭圆形代表属性。最后,用“M”和“N”标记关系线。


重点回顾:绘制ER图

遵循这些步骤:实体 (E) -> 属性 (A) -> 主键 (P) -> 关系 (R) -> 基数 (C) (简称EAP-RC)。这个过程能将一个现实世界的问题转化为清晰的数据库计划。


清理混乱:数据冗余和规范化

想象一下,你在教科书的每一页都写上你的完整地址。这会浪费空间,如果你搬家,你就必须更新每一页!这个问题就称为数据冗余 (data redundancy)

数据冗余是数据库中不必要的数据重复。这很糟糕,因为它可能导致:

  • 更新异常 (Update Anomaly):如果你在一个地方更改数据,你可能会忘记在所有地方都更改它。
  • 插入异常 (Insertion Anomaly):除非另一部分信息已经存在,否则你无法添加新信息。
  • 删除异常 (Deletion Anomaly):删除一部分数据可能会意外删除其他不相关的数据。

我们用来解决这个问题并减少冗余的过程称为规范化 (Normalization)。把它想象成整理一个非常混乱的房间,把所有东西都放回正确的抽屉里。

规范化有几个层次,或称“规范形式”,但对于香港中学文凭考试 (HKDSE),你需要知道前三个。

第一规范形式 (1NF):每个单元格只有一个值

规则:如果表格的每个单元格都包含单一、原子性 (不可再分割) 的值,并且没有重复的组,则该表格处于1NF。

不良例子 (非1NF):

一个学生在一个单元格中有多个电话号码。

如何修正:为每个电话号码创建一个独立的行,重复学生的信息。

第二规范形式 (2NF):没有部分依赖

规则:表格必须处于1NF,并且每个非键属性都必须依赖于整个主键。此规则仅在你有复合主键 (composite primary key) (由两个或更多字段组成的主键) 时才重要。

部分依赖 (Partial Dependency):这是指非键属性只依赖于复合主键的一部分。

如何修正:如果你发现部分依赖,则拆分该表格。将部分依赖的字段,连同它们所依赖的主键部分,移到一个新表格中。

第三规范形式 (3NF):没有传递依赖

规则:表格必须处于2NF,并且没有传递依赖 (transitive dependencies)

传递依赖:这是指一个非键属性依赖于另一个非键属性,而不是直接依赖于主键。(想象:A -> B -> C。C依赖于B,而B依赖于A。关键是A)。

例子:一个表格有学生编号 (StudentID)、老师姓名 (TeacherName) 和老师办公室 (TeacherOffice)。老师办公室 (TeacherOffice) 依赖于老师姓名 (TeacherName),而不是学生编号 (StudentID)。这就是传递依赖。

如何修正:再次拆分表格!将传递依赖的字段 (以及它们所依赖的字段) 移到一个新表格中。


记忆口诀:“键,全键,唯键”
  • 1NF:数据依赖于主键。(单一值)
  • 2NF:数据依赖于整条主键。(没有部分依赖)
  • 3NF:数据只依赖于主键。(没有传递依赖)

重点回顾:规范化

规范化是创建高效、可靠数据库的关键过程,它能消除数据冗余和异常。大多数设计良好的数据库都处于3NF。


回头看:何时使用反规范化

等等,经过这么一番整理后,为什么我们还会想让它再次混乱呢?有时,拥有太多拆分的表格 (高度规范化) 会导致数据检索速度变慢。为了生成一个简单的报告,电脑可能需要连接许多表格,这会花费时间。

反规范化 (Denormalisation) 是指有意地将一些冗余数据重新添加回数据库,以提高查询性能的过程。这是一种权衡:你牺牲了部分数据的“纯净度”以换取速度。这是一种进阶技术,通常在速度绝对关键时使用。


从蓝图到现实:将ER图转换为表格

当你的ER图完美无瑕且数据结构已经规范化后,就是时候创建实际的数据库表格了。以下是相关规则:

规则1:映射实体
ER图中的每个实体都会成为数据库中的一个表格。实体的名称会成为表格的名称。

规则2:映射属性
每个属性都会成为该表格中的一个字段 (column)。键属性会成为主键字段。

规则3:映射关系 (重要部分!)

  • 对于一对多 (1:M) 关系:取“一”方的主键,并将其作为新字段添加到“多”方的表格中。这个新字段称为外键 (foreign key)。它将两个表格链接起来。

  • 对于多对多 (M:N) 关系:你无法直接链接它们!你必须创建一个新表格,称为链接表 (linking table)连接表 (junction table)
    - 这个新表格将包含两个原始表格的主键。这些键作为外键。
    - 这两个外键通常共同构成链接表的复合主键。
    - 这个过程成功地将M:N关系“解决”为两个1:M关系。


例子:我们的图书馆ER图

我们的 `Student` (多) -- `Borrows` -- (多) `Book` ER图将变成三个表格:

1. 学生表格 (Student Table) (学生编号, 学生姓名, 班级)

2. 书本表格 (Book Table) (书本编号, 书名, 作者)

3. 借阅表格 (链接表) (Borrows Table (Linking Table)) (学生编号, 书本编号, 借阅日期)

现在,“学生”表格与“借阅”表格之间存在一对多关系,而“书本”表格也与“借阅”表格之间存在一对多关系。问题解决了!


重点回顾:转换ER图

将ER图映射到表格是一个有明确规则的机械化过程。最重要的一条规则是记住如何透过创建链接表来处理多对多 (M:N) 关系。


谁掌握钥匙?数据隐私与访问权限

数据库包含有价值的信息。你肯定不希望一个学生能够查看或更改另一个学生的成绩,对不对?这就是数据隐私发挥作用的地方。

我们透过控制谁可以做什么来保护数据。这透过访问权限 (access rights) (也称为许可权) 来管理。

把它想象成办公大楼里的门禁卡。CEO的卡可以打开所有门,而实习生的卡可能只能打开主入口和休息室。

在数据库中,我们可以为不同的用户授予特定的权限,例如:

  • SELECT (查询):读取/查看数据的权限。
  • INSERT (插入):添加新数据的权限。
  • UPDATE (更新):更改现有数据的权限。
  • DELETE (删除):删除数据的权限。

透过仅授予用户完成工作所需的最低权限 (这称为最小权限原则 (Principle of Least Privilege)),我们可以确保数据的隐私和安全。例如,图书馆前台职员可能对借阅记录表格拥有 `SELECT` 和 `INSERT` 权限,但他们不会对主要学生信息表格拥有 `DELETE` 权限。


重点回顾:访问权限

使用访问权限对于保护数据至关重要。它确保只有经授权的人才能查看或修改敏感信息,这是构建安全可靠系统的核心部分。