计算机科学 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: 除了键以外,没有别的依赖(非键属性之间无依赖)。
数据库解决了文件系统中的冗余和不一致问题。我们利用实体、记录、字段和键(PK, FK)来高效结构化数据。范式化(1NF, 2NF, 3NF)是拆分表以避免数据重复和依赖问题的过程。
8.2 数据库管理系统 (DBMS)
数据库管理系统 (DBMS) 是一种软件,它充当用户/应用程序与数据库数据之间的接口。它处理所有复杂的组织、安全和存储任务。
DBMS 的功能
DBMS 通过提供以下核心功能来解决文件系统的局限性:
- 数据管理: 有效存储、检索、更新和管理数据的综合能力。
- 数据字典(Data Dictionary / Metadata): 存储数据结构定义(元数据)。它包含表名、字段名、数据类型、主键和关系等信息。它是数据库的蓝图。
- 数据建模与逻辑模式(Logical Schema): 提供创建数据库结构的工具,将数据的逻辑组织方式与物理存储方式分离。
- 数据完整性: 确保数据准确、一致、可靠(例如,通过参照完整性规则)。
- 数据安全: 通过以下方式保护数据:
- 访问权限: 向个人或用户组分配特定权限(读、写、删除)。
- 备份程序: 提供保存数据库副本的机制,以便在灾难发生后恢复。
你知道吗? 数据完整性非常重要。如果你的数据库允许价格字段包含文本或负数,你的系统将崩溃或产生不可靠的结果!
DBMS 软件工具
DBMS 为用户和开发者提供各种工具:
- 开发者接口: 一套(通常是图形化的)工具,允许开发者定义表、设置关系、管理安全性和运行查询。
- 查询处理器: DBMS 的心脏。它将用户查询(如 SQL 语句)转换为计算机可执行的物理操作,以检索或修改数据。
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 KEY 或 FOREIGN 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;
SQL 是管理数据库的语言。DDL 定义结构(CREATE, ALTER)。DML 管理数据(INSERT, UPDATE, DELETE, SELECT)。在查询时,一定要记住使用 WHERE 子句进行过滤,并使用 INNER JOIN 链接相关表。