DataBase
本文最后更新于 2024年9月26日 晚上
数据库
前言
学科地位:
主讲教师 | 学分配额 | 学科类别 |
---|---|---|
孔力 | 3.5 | 自发课 |
成绩组成:
平时 | 作业+实验 | 期末(闭卷 or 开卷) |
---|---|---|
10% | 40% | 50% |
教材情况:
课程名称 | 选用教材 | 版次 | 作者 | 出版社 | ISBN 号 |
---|---|---|---|---|---|
数据库原理与应用 | 《数据库系统概论》 | 6 | 王珊等 | 高等教育出版社 | 978-7-04-059125-5 |
学习资源:
- 课程官网:数据库系统概论 (ruc.edu.cn)
为什么要学这门课?
感觉没什么意义,毕竟只讲关系型数据库,而这个是再简单不过的数据模型了,哪怕加上了外键也不会很复杂。但我深知 db 的奥妙与深度绝不止于此,但是就目前上课情况来看应该是达不到这种程度了,毕竟连最基本的数据库编程都是不做要求的。
会收获什么?
熟悉一下关系型数据库的理论吧,顺便准备好被国产的 openGuass ex 一把。其余的数据库类型以及拓展知识就靠自学吧。
基础篇
绪论
数据库发展范式:人工系统 文件系统 数据库系统
数据库系统概念图:
---
title: 数据库系统
---
graph TB
DBM[数据库管理员]
subgraph 数据
DB[(数据库\n「内模式」)]
DBMS[数据库管理系统\n「逻辑模式」]
subgraph DBAP[应用程序]
direction LR
out_model1[「外模式1」]
out_model2[「外模式2」]
out_model1 <-.-> 应用A
out_model1 <-.-> 应用B
out_model2 <-.-> 应用C
end
end
DBM --> 数据
DB <-.-> DBMS
DBMS <-.-> DBAP
数据库的三级模式:从硬件到应用将一个数据库抽象为三层。其中:
- 内模式:硬件存储数据的方式;
- 逻辑模式:数据库管理的方式,也就是数据存储方式的 逻辑 抽象。进而引出后续如何存储数据的「数据模型」概念;
- 外模式:不同的应用对全体数据有不同的访存权限。一个外模式可以对应多个应用程序,但是一个应用程序只能对应一个外模式。
数据模型:逻辑模式的具体实现策略。我们需要对现实世界的数据进行抽象进而便于虚拟化存储,以及后续对数据库进行增删改查等操作。从发展角度来看,数据模型一共经历了三个阶段,分别为 层次模型 网状模型 关系模型 三个阶段。其中关系模型是数据库「逻辑模式」的实现方式,有以下两个关键点:
-
三要素:数据结构(二维表)、数据操作(增删改查)和关系的完整性约束(每一个实体能通过主键唯一检索、外键引用必须存在、关系要根据业务需求设定完备)
-
名词对照:关系(一张表)、元组(一行数据)、属性(一个字段)和码(主键)。
关系模型
基本概念:
关系操作的最小单位是什么?所有的增删改查都是以集合为最小单位。
外键是什么?有什么用?一张表的外键必须是另一张表的主键以确保数据的完整性,因为主键是必须全部存在的。当然,外键也可以引用本表的主键。有了外键就可以实现表与表之间一对多或多对多的关系。
-
关于一对多。例如,一个客户可以购买很多商品,而一个被购买的商品只能隶属于一个客户;
▶实例假设有两个表:
customers
和orders
。customers
表保存客户的信息,orders
表保存订单信息。每个订单都应该对应一个客户,所以可以使用外键将这两个表关联起来。创建表
1
2
3
4
5
6
7
8
9
10
11
12
13-- 创建 customers 表
CREATE TABLE customers (
customer_id INT PRIMARY KEY,
customer_name VARCHAR(100)
);
-- 创建 orders 表,order_id 是主键,customer_id 是外键,引用 customers 表中的 customer_id
CREATE TABLE orders (
order_id INT PRIMARY KEY,
order_date DATE,
customer_id INT,
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);在上述示例中,
orders
表中的customer_id
是一个外键,它引用了customers
表中的customer_id
列。这样一来,只有在customers
表中存在的customer_id
才能在orders
表中作为合法的customer_id
。这确保了每个订单都有有效的客户。插入数据(增):当向
orders
表中插入一条新记录时,数据库会检查customer_id
是否在customers
表中存在。如果不存在,插入操作会失败。1
2
3
4
5
6
7
8-- 插入一条合法记录
INSERT INTO customers (customer_id, customer_name) VALUES (1, 'Alice');
-- 插入订单记录,外键 customer_id 存在于 customers 表中
INSERT INTO orders (order_id, order_date, customer_id) VALUES (101, '2024-09-26', 1);
-- 尝试插入一个无效的订单记录(客户ID为2在 customers 表中不存在)
INSERT INTO orders (order_id, order_date, customer_id) VALUES (102, '2024-09-26', 2); -- 会失败删除或更新时(删 | 改):如果试图删除
customers
表中的某个customer_id
,而该 ID 在orders
表中被引用,会引发外键约束错误。可以通过设置外键的级联操作(如ON DELETE CASCADE
或ON UPDATE CASCADE
)来控制这种行为,使删除或更新操作可以自动级联到相关表。1
2
3
4
5
6
7
8
9
10-- 定义外键时使用级联删除
CREATE TABLE orders (
order_id INT PRIMARY KEY,
order_date DATE,
customer_id INT,
FOREIGN KEY (customer_id) REFERENCES customers(customer_id) ON DELETE CASCADE
);
-- 删除客户1时,orders 表中所有引用 customer_id = 1 的订单都会自动被删除
DELETE FROM customers WHERE customer_id = 1; -
关于多对多。例如,一门课程需要多门先修课,而一门课程也可以成为很多课程的选修课。
▶实例这里课程与先修课之间的实体对象是相同的,并且一门课程可以有许多门先修课,而一门课程也可能成为很多课程的先修课,如果还是像一对多那样进行存储,即课程表中增加一列先修课,就会导致先修课列中可能出现多个信息的情况,这也就不符合关系型数据库中的第一范式:原子性。因此我们不得不创建一个新表,也就是中间表,来存储课程和先修课之间的关系。
创建表
1
2
3
4
5
6
7
8
9
10
11
12
13
14-- 创建 courses 表
CREATE TABLE courses (
course_id INT PRIMARY KEY,
course_name VARCHAR(100)
);
-- 创建 prerequisites 表,其中 course_id 和 prerequisite_id 都是外键
CREATE TABLE prerequisites (
course_id INT, -- 课程ID
prerequisite_id INT, -- 先修课ID
PRIMARY KEY (course_id, prerequisite_id), -- 组合主键
FOREIGN KEY (course_id) REFERENCES courses(course_id) ON DELETE CASCADE, -- 课程ID外键
FOREIGN KEY (prerequisite_id) REFERENCES courses(course_id) ON DELETE CASCADE -- 先修课ID外键
);在这个设计中:
courses
表保存所有课程的基本信息,每门课程都有唯一的course_id
。prerequisites
表用于表示多对多的先修课关系,其中course_id
是当前课程的 ID,prerequisite_id
是该课程的先修课程的 ID。两者都引用了courses
表中的course_id
列,构成多对多的关系。
插入数据(增)
插入课程记录:
1
2
3
4
5-- 插入一些课程记录
INSERT INTO courses (course_id, course_name) VALUES (1, 'Mathematics');
INSERT INTO courses (course_id, course_name) VALUES (2, 'Physics');
INSERT INTO courses (course_id, course_name) VALUES (3, 'Computer Science');
INSERT INTO courses (course_id, course_name) VALUES (4, 'Linear Algebra');插入先修课关系记录:
1
2
3
4
5
6-- 课程 Computer Science 需要 Mathematics 和 Physics 作为先修课
INSERT INTO prerequisites (course_id, prerequisite_id) VALUES (3, 1); -- Computer Science -> Mathematics
INSERT INTO prerequisites (course_id, prerequisite_id) VALUES (3, 2); -- Computer Science -> Physics
-- 课程 Physics 需要 Linear Algebra 作为先修课
INSERT INTO prerequisites (course_id, prerequisite_id) VALUES (2, 4); -- Physics -> Linear Algebra在上述例子中:
prerequisites
表表示课程之间的先修关系。例如,Computer Science
课程的course_id
是 3,它的先修课是Mathematics
(prerequisite_id
为 1)和Physics
(prerequisite_id
为 2)。- 通过这种方式,可以表示一门课程有多门先修课,同时一门课程也可以作为多门课程的先修课。
- 插入的
course_id
和prerequisite_id
必须都是courses
表中已有的课程,否则会插入失败。
删除数据(删)
由于在创建表时设置了级联操作
ON DELETE CASCADE
,因此当我们删除任何一个存在的课程时,与该课程相关的所有先修课信息也都会被级联删除。无论该课程是其他课程的先修课,还是它自身有先修课。
SQL
安全性
完整性
开发篇
关系数据理论
数据库设计
数据库编程 *
这一章不作考试要求。樂。
进阶篇
关系数据库存储管理
关系查询
怎么查询关系的?又可以怎么优化查询策略呢?