计算机科学 9618:学习笔记 - 数据库(AS Level)

你好,未来的数据库大师!欢迎来到数据库章节。无论是在下单点披萨、查询银行余额,还是在线观看电影,你都在与数据库进行交互。本章旨在带你理解海量数据是如何被组织、保护并高效检索的。它是几乎所有现代数字应用的核心支柱!如果术语看起来很陌生,请不要担心,我们会将所有内容拆解成易于消化的部分。


8.1 数据库概念

文件系统的局限性

在数据库普及之前,企业通常使用文件系统(file-based approach)存储数据——本质上就是由不同部门管理的大量独立文件(例如各自的电子表格)。
这种方法有严重的局限性:

  • 数据冗余(Data Redundancy): 相同的数据在不同的文件中被多次存储。(例如:客户地址既存储在销售文件中,又存储在会计文件中。)
  • 数据不一致(Data Inconsistency): 由于数据重复,更新可能不会在所有地方同步,导致信息冲突。(例如:销售文件显示的是旧地址,但会计文件显示的是新地址。)
  • 共享困难: 数据分散,不同的程序或部门难以同时访问。
  • 缺乏安全性: 很难在大量独立文件中应用统一的安全规则。

关系型数据库简介

关系型数据库(Relational Database)(我们学习的类型)通过将数据存储在逻辑关联的结构化表中,解决了文件系统的局限性。

数据库核心术语(数据语言)

掌握这些术语至关重要,因为它们在考试题目中经常互换使用:

  • 实体(Entity): 被记录数据的对象,可以是人、地点、事物、事件或概念。(例如:客户 CUSTOMER、产品 PRODUCT、订单 ORDER。)
  • 表(Relation): 存储关于单个实体的数据。它由行和列组成。
  • 记录(Tuple): 表中的单行,包含与实体的一个实例相关的所有数据。(例如:某一个特定的客户。)
  • 字段(Attribute): 表中的单列,代表实体的某一特征或属性。(例如:客户姓名 CustomerName、产品价格 ProductPrice。)

记忆小贴士: 想想 Excel 电子表格:
表(Table) = 整个工作表
记录(Record) = 一行
字段(Field) = 一列

理解数据库键(Keys)

键对于高效识别和链接数据至关重要。

  • 主键(Primary Key, PK): 能唯一标识表中每一条记录的字段(或一组字段)。
    (例如:CUSTOMER 表中的 CustomerID。)
  • 候选键(Candidate Key): 任何可能被用作主键的字段(或字段组合),因为它能唯一标识记录。最终只选定其中一个作为主键。(例如:CustomerID 或身份证号 NationalInsuranceNumber 都可以是候选键。)
  • 二级键/索引键(Secondary Key/Index Key): 主要用于快速搜索或排序记录的字段。它不必是唯一的。(例如:通过姓氏 LastName 搜索 CUSTOMER 表。)
  • 外键(Foreign Key, FK): 一个表中的字段,它指向*另一个*表中的主键。这是建立关系的方式!(例如:Order 表中包含 CustomerID 作为 FK,以链接回 Customer 表。)
关系与参照完整性

关系定义了实体如何交互:

  • 一对多(1:M): 最常见的类型。表 A 中的一条记录与表 B 中的多条记录相关联。(例如:一个 CUSTOMER 可以下多个 ORDERS。)
  • 一对一(1:1): 表 A 中的一条记录只与表 B 中的一条记录相关联。(较少见,通常用于安全性或拆分大型表。)
  • 多对多(M:M): 表 A 中的多条记录与表 B 中的多条记录相关联。这不能直接在关系型数据库中实现,必须通过一个新的中间(连接)表拆分为两个 1:M 关系。(例如:多个 STUDENTS 可以选修多门 COURSES。)

参照完整性(Referential Integrity): 此规则确保表之间的关系一致。它防止创建指向另一个表中不存在的记录的链接(例如,你不能为在 CUSTOMER 表中不存在的 CustomerID 创建订单)。

实体-关系(E-R)图

E-R 图是一种视觉工具,用于记录数据库结构,展示其中的实体及其之间的关系。

  • 实体通常用矩形表示。
  • 关系用连接实体的线条表示,通常使用特殊记号(如乌鸦脚符号 Crow’s Foot 或 Chen 表示法)来标明基数(1:M, 1:1)。

范式化(1NF, 2NF, 3NF)

范式化(Normalisation)是组织数据库以减少冗余并提高数据完整性的过程。它包括一系列称为范式(Normal Forms, NF)的步骤。我们重点研究前三个。

第一范式(1NF)

若要满足 1NF,表必须:

1. 不包含重复组(即一个单元格内没有多个值)。
2. 所有属性(字段)包含原子值(即不可再拆分)。

步骤:如果一名学生选修了三门课程,不能将所有三个课程代码列在一个单元格中。必须为每门课程新建一行,或将数据拆分到多个表中。

第二范式(2NF)

若要满足 2NF,表必须:

1. 已经满足 1NF。
2. 所有非键属性完全依赖于整个主键。这仅在主键是组合键(由两个或多个字段组成)时才需要关注。

步骤:如果你的主键是(OrderID, ItemNumber),且 ItemName 只依赖于 ItemNumber(主键的一部分),则必须将 ItemName 移到单独的 ITEM 表中。

第三范式(3NF)

若要满足 3NF,表必须:

1. 已经满足 2NF。
2. 不存在传递依赖。这意味着非键属性不能依赖于其他非键属性。

步骤:在表中,如果 CityName 决定了 PostCode,而 PostCode 不是键,那么这就是传递依赖。你必须将 CityName 和 PostCode 移入单独的 POSTCODE 表中。

范式化助记词:
1NF: 无重复组。
2NF: 依赖于整个(Whole)主键。
3NF: 除了键以外,没有别的依赖(非键属性之间无依赖)。

核心总结 (8.1)

数据库解决了文件系统中的冗余和不一致问题。我们利用实体、记录、字段和键(PK, FK)来高效结构化数据。范式化(1NF, 2NF, 3NF)是拆分表以避免数据重复和依赖问题的过程。


8.2 数据库管理系统 (DBMS)

数据库管理系统 (DBMS) 是一种软件,它充当用户/应用程序与数据库数据之间的接口。它处理所有复杂的组织、安全和存储任务。

DBMS 的功能

DBMS 通过提供以下核心功能来解决文件系统的局限性:

  • 数据管理: 有效存储、检索、更新和管理数据的综合能力。
  • 数据字典(Data Dictionary / Metadata): 存储数据结构定义(元数据)。它包含表名、字段名、数据类型、主键和关系等信息。它是数据库的蓝图。
  • 数据建模与逻辑模式(Logical Schema): 提供创建数据库结构的工具,将数据的逻辑组织方式与物理存储方式分离。
  • 数据完整性: 确保数据准确、一致、可靠(例如,通过参照完整性规则)。
  • 数据安全: 通过以下方式保护数据:
    • 访问权限: 向个人或用户组分配特定权限(读、写、删除)。
    • 备份程序: 提供保存数据库副本的机制,以便在灾难发生后恢复。

你知道吗? 数据完整性非常重要。如果你的数据库允许价格字段包含文本或负数,你的系统将崩溃或产生不可靠的结果!

DBMS 软件工具

DBMS 为用户和开发者提供各种工具:

  • 开发者接口: 一套(通常是图形化的)工具,允许开发者定义表、设置关系、管理安全性和运行查询。
  • 查询处理器: DBMS 的心脏。它将用户查询(如 SQL 语句)转换为计算机可执行的物理操作,以检索或修改数据。
核心总结 (8.2)

DBMS 软件至关重要;它通过数据字典管理数据结构,通过数据完整性强制执行一致性,并通过数据安全控制权限。查询处理器则是执行你发送给数据库请求的核心组件。


8.3 数据定义语言 (DDL) 和 数据操作语言 (DML)

数据库任务分为两类,均使用行业标准语言:结构化查询语言 (SQL)

DDL (数据定义语言): 用于创建、修改和删除数据库的*结构*(空的“盒子”和规则)。

DML (数据操作语言): 用于插入、检索、修改和删除定义结构内的*实际数据*。

使用 SQL 进行数据定义 (DDL)

DDL 命令用于构建数据库蓝图。

1. 创建数据库

CREATE DATABASE SchoolRecords;

2. 创建表(定义结构)

我们必须为每个属性指定字段名和适当的数据类型

  • CHARACTER: 定长字符串(例如,存储双字母的国家代码)。
  • VARCHAR(n): 最多 'n' 个字符的变长字符串(常用于姓名、地址)。
  • BOOLEAN: 存储 TRUE 或 FALSE(是/否)。
  • INTEGER: 整数(用于 ID、计数器)。
  • REAL: 带小数点的数字(用于价格、测量值)。
  • DATE: 存储日期。
  • TIME: 存储时间。

DDL 示例:

CREATE TABLE Student (
StudentID INTEGER PRIMARY KEY,
StudentName VARCHAR(50) NOT NULL,
IsEnrolled BOOLEAN
);

3. 修改表结构 (ALTER TABLE)

我们使用 ALTER TABLE 来更改结构,例如添加约束(如主键和外键)或添加新列。

添加外键:

ALTER TABLE Enrollment
ADD FOREIGN KEY (CourseID) REFERENCES Course (CourseID);

DDL 复习

DDL 关注结构:CREATE 数据库或表,ALTER 表结构,添加 PRIMARY KEYFOREIGN KEY 约束。

使用 SQL 进行数据操作 (DML)

DML 命令用于管理表中存储的记录。

数据维护(添加、修改、删除记录)

1. 插入数据(添加记录)

INSERT INTO Student (StudentID, StudentName, IsEnrolled)
VALUES (101, 'Alice Smith', TRUE);

2. 更新数据(修改记录)

WHERE 子句在这里非常关键,用于定位特定记录。没有它,你将更新整个表!(这是最常见的错误!)

UPDATE Student
SET IsEnrolled = FALSE
WHERE StudentID = 101;

3. 删除数据(移除记录)

DELETE FROM Student
WHERE StudentID = 101;

查询数据 (SELECT 语句)

这是最常见的 DML 任务:检索信息。AS Level 仅要求涉及最多两张表的查询。

基本检索 (SELECT, FROM, WHERE)

SELECT StudentName, StudentID
FROM Student
WHERE IsEnrolled = TRUE;

排序结果 (ORDER BY)

SELECT StudentName
FROM Student
ORDER BY StudentName DESC; -- DESC 表示降序排列

连接两张表 (INNER JOIN)

要从两个链接表中检索字段,我们使用 INNER JOIN。必须指定链接条件(主键等于外键的地方)。

示例:获取下了特定订单(订单 ID 50)的学生姓名:

SELECT S.StudentName
FROM Student S INNER JOIN Order O
ON S.StudentID = O.StudentID
WHERE O.OrderID = 50;

分组与聚合 (GROUP BY, SUM, COUNT, AVG)

这些函数用于对记录集执行计算:

  • COUNT: 统计行数或非空值的数量。
  • SUM: 计算数值字段的总和。
  • AVG: 计算数值字段的平均值。
  • GROUP BY: 当应用聚合函数来基于公共字段值进行汇总时使用。

示例:统计已注册的学生人数(按状态分组):

SELECT IsEnrolled, COUNT(StudentID)
FROM Student
GROUP BY IsEnrolled;

核心总结 (8.3)

SQL 是管理数据库的语言。DDL 定义结构(CREATE, ALTER)。DML 管理数据(INSERT, UPDATE, DELETE, SELECT)。在查询时,一定要记住使用 WHERE 子句进行过滤,并使用 INNER JOIN 链接相关表。