PPT 课后习题
5.1.1 DBMS为什么采用分层架构设计实现?
- 模块化设计:
- 将系统划分为多个模块,每个模块负责特定功能,提高了系统的可维护性和扩展性。
- 抽象数据模型:
- 分层架构提供了不同层次的抽象视图,隐藏底层实现细节,使用户更专注于逻辑模型和应用程序开发。
- 灵活性和可扩展性:
- 各层次独立,可单独修改、升级和替换,适应不同需求和环境的变化。
- 性能优化:
- 可针对不同层次进行性能优化,提高数据访问速度和查询处理效率。
- 标准化和互操作性:
- 定义标准接口和协议,促进不同厂商的产品互操作,提高了系统的可移植性和互操作性。
分块可维护拓展、抽象隐藏底层、灵活、优化、可移植性
5.1.2 如何理解如下DBMS的工作原理?
- 用户/应用程序:
- 用户或应用程序与数据库进行交互,提交查询和操作请求。
- 查询处理器:
- 编译器将用户输入的SQL查询转换为数据库系统可执行的形式。
- 查询优化器分析查询计划,确定最有效的执行路径。
- 执行计划器根据优化器确定的计划执行查询操作。
- 数据库管理员 (DBA):
- 负责维护和管理数据库系统,包括设置系统参数、管理权限等。
- DDL语句和编译器:
- DDL语句用于定义和修改数据库结构,DDL编译器处理这些语句。
- DML编译器:
- 处理数据操作语言(DML)语句,如插入、查询、更新和删除数据。
- 查询支持:
- 数据字典/系统目录存储数据库结构的元数据,为查询提供支持。
- 索引/存储路径管理管理和优化数据索引。
- 事务处理:
- 并发控制确保数据的一致性和完整性。
- 恢复管理器在系统故障时恢复数据到一致状态。
- 数据存储管理:
- 缓冲区管理管理内存中的缓冲区,提高数据访问速度。
- 文件管理组织和管理数据库文件。
- 数据管理直接管理存储在磁盘上的数据,确保其完整性和安全性。
5.2.1 数据库为什么需要有多个表空间?
- 性能优化:将不同的数据存储在不同的表空间中,可以提高数据库的性能。
- 管理和维护:可以更好地管理和维护数据库,控制数据访问和管理权限。
- 故障恢复和备份:简化故障恢复和备份过程,提高效率。
- 空间管理:更有效地管理数据库空间,满足不同的数据存储需求。
- 分区和存储优化:实现分区和存储优化,提高性能和资源利用率。
5.2.2 数据库存储引擎如何工作?
- 数据库存储引擎负责管理数据的存储、检索和操作。
- 其工作原理包括:数据组织、存储管理、索引管理、缓存管理、事务管理等方面。
- 存储引擎通过这些功能提供高效的数据访问和操作,并影响数据库的性能、可靠性和扩展性。
5.3.1 哪类索引技术方法适合于关系数据库数据范围查询?
PPT 上只讲了B+树索引和散列索引
B+树索引的优点:
- 范围查询高效:B+树索引适用于范围查询,因为其叶子节点形成了有序链表,可以快速定位范围内的数据。
- 支持顺序访问:B+树索引叶子节点形成了有序链表,适合顺序访问,如扫描整个表的操作。
- 适用于范围查询:B+树索引在范围查询方面性能优异,特别是在数据库系统中,范围查询是一种常见的查询操作。
B+树索引的缺点:
- 不适合等值查询:B+树索引对等值查询性能不如哈希索引。
- 索引维护成本高:B+树索引的维护成本较高,因为需要频繁地进行节点的分裂和合并操作,尤其是在频繁的插入和删除操作场景下。
- 索引高度不稳定:当B+树索引中的数据不均匀分布时,可能导致索引高度不稳定,影响查询性能。
散列索引的优点:
- 等值查询高效:散列索引适用于等值查询,由于其哈希函数的特性,可以快速定位到具体的数据行。
- 索引维护成本低:散列索引的维护成本相对较低,因为不需要进行节点的分裂和合并操作。
- 不受索引高度影响:散列索引的查询性能不受索引高度的影响,因为哈希索引的查询复杂度为O(1)。
散列索引的缺点:
- 不支持范围查询:散列索引不适用于范围查询和排序操作,因为哈希函数的不可预测性,无法提供有序性。
- 冲突处理复杂:散列索引可能存在哈希冲突问题,即多个索引键值映射到同一个哈希桶中,需要额外的处理机制来解决冲突。
- 不支持部分匹配查询:散列索引不支持部分匹配查询,只能进行精确匹配。
- B+树索引:其非叶子节点只存储索引键值,而叶子节点包含了全部索引键值及指向数据行的指针。B+ 树索引更适合范围查询,因为范围查询可以通过遍历叶子节点的方式实现。
- 此外还有覆盖索引(索引包含了需要查询的列)、位图索引(对于数据不均匀的情况)、R树索引(适用于空间数据查询)
散列索引在关系数据库中不太适合用于范围查询,因为散列索引是基于哈希函数的索引,其主要适用于等值查询,而不是范围查询。散列索引将索引键映射到特定的哈希桶中,然后通过哈希函数直接访问对应的哈希桶,从而快速定位到数据行。但是,由于哈希函数的不可预测性,散列索引无法提供按顺序访问数据的功能,因此不适合范围查询。
当进行范围查询时,需要按顺序访问索引键值,而散列索引无法提供按顺序访问的能力,因此会导致性能低下。此外,散列索引还会导致哈希冲突问题,即多个索引键值映射到同一个哈希桶中,可能会增加范围查询的成本。
因此,对于范围查询来说,通常不建议使用散列索引。相反,B 树索引、B+ 树索引、覆盖索引等更适合范围查询,因为它们可以提供按顺序访问数据的能力,从而更好地支持范围查询操作。
5.3.2 PostgreSQL数据库支持哪些索引类型?
(感觉不会考,知道B+树索引和散列索引原理应该就差不多了)
- B 树索引:
- B 树索引是最常见的索引类型,在 PostgreSQL 中默认使用的索引类型。它适用于等值查询、范围查询和排序操作。
- 哈希索引:
- 哈希索引适用于等值查询,但不支持范围查询或排序操作。在 PostgreSQL 中,哈希索引适用于=、IN、和JOIN 操作,但不适用于范围查询、ORDER BY 或 GROUP BY。
- GIN 索引(一般化倒排索引):
- GIN 索引适用于包含多个元素的列,如数组和全文搜索。它支持多值查询和范围查询。
- GiST 索引(一般化搜索树):
- GiST 索引适用于包含复杂数据类型的列,如几何数据类型和全文搜索。它支持范围查询、相似度搜索和复杂查询条件。
- BRIN 索引(分块范围索引):
- BRIN 索引适用于大数据表的范围查询。它可以显著减少索引大小,并加速范围查询操作。
- 空间索引:
- PostgreSQL 还支持用于空间数据类型(如点、线、多边形等)的空间索引,包括 GiST 和 SP-GiST 索引类型。
- 全文搜索索引:
- PostgreSQL 提供了用于全文搜索的全文搜索索引类型,如 GIN、GiST 和 SP-GiST 索引,用于支持全文搜索功能。
5.4.1 在特定数据库应用系统处理中,为什么需要有事务机制?
数据库事务指的是一系列数据库操作组成的逻辑工作单元,这些操作要么全部成功执行,要么全部回滚(撤销),以保证数据的一致性和完整性。
- 数据一致性和完整性:数据库应用系统往往涉及多个相关数据的操作,如插入、更新、删除等,这些操作需要保证数据的一致性和完整性。事务机制可以确保一系列操作要么全部执行成功,要么全部失败回滚,避免了数据损坏或不一致的情况。
- 并发控制:在多用户或多应用程序同时访问数据库的情况下,可能会出现数据竞争和并发问题,如丢失更新、脏读、不可重复读等。事务机制通过并发控制机制,如锁定和多版本并发控制(MVCC),确保事务之间的隔离性,避免了数据的混乱和错误。
- 故障恢复:数据库系统可能会发生各种故障,如系统崩溃、硬件故障等,这可能会导致数据丢失或损坏。事务机制通过事务日志和恢复机制,可以将数据库恢复到之前的一致状态,防止了数据丢失和数据库不可用的情况。
- 业务逻辑的原子性:数据库应用系统通常涉及到复杂的业务逻辑,包括多个数据库操作的组合和关联。事务机制可以确保这些复杂的业务逻辑在执行过程中是原子的,要么全部执行成功,要么全部失败回滚,保证了业务操作的完整性和准确性。
- 性能优化:事务机制可以通过批量提交和回滚等优化技术来提高数据库操作的性能和效率,减少了数据库系统的资源消耗和开销。
5.4.2 如何理解关系数据库事务的ACID特性?
- 原子性(Atomicity):事务中的所有操作要么全部执行成功,要么全部不执行(失败回滚)。(不存在部分执行的情况)
- 一致性(Consistency):事务多次执行,其结果应当一致。
- 隔离性(Isolation):事务与事务之间隔离,并发执行时透明。
- 持久性(Durability):事务完成后,数据改变必须是永久的。(即使发生系统崩溃或电源故障也不会丢失)
5.4.注 事务程序相关
-- 事务程序中不能使用DATABASE相关的CREATE等语句、LOG相关的BACKUP语句
-- 示例如下:
START TRANSACTION;
INSERT INTO College(CollegeID,CollegeName)
VALUES ('004','外语学院');
INSERT INTO College(CollegeID,CollegeName)
VALUES ('005','数学学院');
INSERT INTO College(CollegeID,CollegeName)
VALUES ('006','信软学院');
COMMIT;
5.5.1 当多个门诊挂号事务程序并发执行时,可能会出现哪些数据不一致问题?
OS、DB一家亲
- 挂号重复:同时挂号可能导致重复挂号问题。
- 并发读写冲突:同时读写数据可能导致数据不一致。
- 资源竞争(mutex):多个事务竞争相同资源导致性能下降或死锁。
- 数据丢失:未适当管理事务可能导致数据丢失或不一致。
5.5.2 某事务程序从账户A转账1000元到账户B,请编写该事务伪代码程序。要求所编写的事务程序在并发执行中能确保数据一致性。
BEGIN TRANSACTION;
-- 查询账户 A 的余额
SELECT balance FROM accounts WHERE account_id = 'A' FOR UPDATE; -- FOR UPDATE 用于锁定被查询的行。
-- 会在事务 COMMIT 或 ROLLBACK 时自动解锁
balance_A = 获取查询结果;
-- 查询账户 B 的余额
SELECT balance FROM accounts WHERE account_id = 'B' FOR UPDATE;
balance_B = 获取查询结果;
-- 检查账户 A 的余额是否足够进行转账
IF balance_A >= 1000 THEN
-- 更新账户 A 的余额
UPDATE accounts SET balance = balance_A - 1000 WHERE account_id = 'A';
-- 更新账户 B 的余额
UPDATE accounts SET balance = balance_B + 1000 WHERE account_id = 'B';
COMMIT;
ELSE
-- 余额不足,回滚事务
ROLLBACK;
提示转账失败;
END IF;
5.5.补 加锁协议
-
一级:修改之前必须先获得排他锁。
- 可避免出现更新丢失,不可解决 重复读取、脏读。
-
二级:在一级加锁协议基础上,读之前必须必须先获得共享锁,读完就释放。
- 可避免出现更新丢失、脏读,可解决 重复读取。(这里PPT说的不对)
-
三级:在二级加锁协议基础上,读之前必须必须先获得共享锁,事务处理完才释放。
- 避免 更新丢失、脏读、重复读取。
5.5.补2 串行化调度
-
二阶段锁定协议:
- 增长阶段:所有事务只能获得锁,不能释放锁。
- 缩减阶段:所有事务只能释放锁,不能获得锁。
以下都是 OS 的东西,看一下怕忘了
- 死锁出现条件:互斥、请求和保持、不剥夺、环路等待
- 防范死锁:一次性申请所需全部资源的申请,使用完后才释放;规定锁定顺序。
- 解决死锁:死锁时,回滚其中的一个事务并取消它对数据库所做的改动。
还有一个 事务隔离级别,包括(读未提交 < 读已提交 < 可重复读 < 可串行化),级别越高,出现数据不一致的可能性越小,但系统吞吐量更小。
5.6.补
5.6.补2
-
用户创建:创建一个新用户,其账号名字为"userA",密码为"123456"。该用户具有登录权限(Login)和角色继承权限(Inherit)系统权限,但它不是超级用户(SuperUser),不具有创建数据库权限(CreateDB)、创建角色权限(CreateRole)、数据库复制权限(Replication),此外数据库连接数(Connection Limit)不受限。
CREATE USER "userA" WITH -- 在PostgreSQL中,未被双引号括起来的标识符将被转换为小写。 LOGIN, NOSUPERUSER, NOCREATEDB, NOCREATEROLE, INHERIT, NOREPLICATION, CONNECTION LIMIT -1, -- 使用 -1 表示不设限制 PASSWORD '123456'; -- 密码这个字符串用单引号 -- 双引号通常用于引用标识符, 会区分大小写 -- 以上的顺序是约定的规范, 顺序不是强制的。
-
用户修改修改用户"userA"的账号密码为"gres123"。同时也限制该用户的数据库连接数为10。
ALTER USER "userA" CONNECTION LIMIT 10 PASSWORD 'gres123';
-
DROP USER "userA";
-
用户授权:在一个工程项目管理系统中,DBA管理员赋予员工用户(userA)对部门表(Department)、员工表(Employee)、项目表表(Project)
和任务表(Assignment)的读取数据权限。GRANT SELECT ON Department TO userA; -- 授予表的SELECT权限 GRANT SELECT ON Employee TO userA; GRANT SELECT ON Project TO userA; GRANT SELECT ON Assignment TO userA; -- 也可以合并: GRANT SELECT ON Department, Employee, Project, Assignment TO userA;
-
角色创建:在工程项目管理系统中,假定需要在ProjectDB数据库内创建经理角色Role_Manager。该角色具有登录权限(Login)和角色继承权限
Inherit)系统权限,但它不是超级用户(SuperUser),不具有创建数据库权限(CreateDB)、创建角色权限(CreateRole)、数据库复制权限(Replication),此外数据库连接数(Connection Limit)不受限。-- 角色:一组具有相同权限的用户 CREATE ROLE "Role_Manager" WITH LOGIN, NOSUPERUSER, NOCREATEDB, NOCREATEROLE, NOINHERIT, NOPEPLIACTION, CONNECTION LIMIT -1;
-
角色权限授予:在创建好经理角色Role_Manager后,还需要赋予该角色对数据库表Department、Employee、Project、Assignment的插入、修改、删除、查询权限。
GRANT SELECT,INSERT,UPDATE,DELETE ON Department TO "Role_Manager"; GRANT SELECT,INSERT,UPDATE,DELETE ON Employee TO "Role_Manager"; GRANT SELECT,INSERT,UPDATE,DELETE ON Project TO "Role_Manager"; GRANT SELECT,INSERT,UPDATE,DELETE ON Assignment TO "Role_Manager"; -- 合并: GRANT SELECT, INSERT, UPDATE, DELETE ON Department, Employee, Project, Assignment TO "Role_Manager"; -- 若要授予全部权限: GRANT ALL PRIVILEGES ON Department TO userA;
5.6 针对选课管理系统的学生、教师角色,如何编写SQL程序授予下表所示对象访问操作权限?
GRANT SELECT ON College,Course,Teacher,Student,Plan,Register TO "StudentRole";
GRANT UPDATE ON Student,Register TO "StudentRole";
GRANT SELECT ON College,Course,Teacher,Student,Plan,Register TO "TeacherRole";
GRANT UPDATE ON Teacher TO "TeacherRole";
GRANT SELECT,INSERT,UPDATE,DELETE ON College,Course,Teacher,Student,Plan,Register TO "AcademicRole";