架构-数据库系统
数据库系统
一、数据库系统概述
(一)课程核心模块
覆盖数据库设计、关系代数、规范化理论、数据控制四大核心模块,旨在构建从理论到实践的完整知识体系至。
(二)典型应用场景
- 数据管理:学生信息管理(如文档中S1、S2关系表)、金融交易系统(如股票交易数据转储)。
- 企业级系统:供应链管理(多表关联查询)、客户关系管理(数据完整性约束)。
二、关系代数:数据库操作的数学基础
(一)集合运算(以学生表S1、S2为例)
运算 | 定义 | 示例结果(S1:3条记录,S2:3条记录) |
---|---|---|
并(∪) | 合并两个关系的所有元组(去重) | 5条记录(No0001、No0003、No0004、No0008、No0021) |
交(∩) | 取两个关系的公共元组 | 1条记录(No0001) |
差(-) | 保留在S1中但不在S2中的元组 | 2条记录(No0003、No0004) |
(二)关系运算(核心操作)
-
投影(π):选择列(如提取学生学号和姓名)
π(Sno, Sname)(S1)
结果:3条记录,仅包含Sno和Sname列。
-
选择(σ):选择行(如筛选学号为No0003的学生)
σ(Sno='No0003')(S1)
结果:1条记录(Candy的信息)。
-
笛卡尔积(×):行的全组合(S1×S2生成9条记录)
特点:列数=两表列数之和,行数=两表行数之积。 -
自然连接(⋈):自动匹配公共属性(如S1和S2通过Sno连接)
公式:S1 ⋈ S2 = π(σ(S1.Sno=S2.Sno)(S1×S2))
结果:保留公共属性列一次,仅1条记录(No0001)。
三、规范化理论:消除数据冗余的核心方法
(一)非规范化问题(以学生-系信息表为例)
学号 | 姓名 | 系号 | 系名 | 系位置 |
---|---|---|---|---|
S01 | 张三 | D01 | 计算机系 | 1号楼 |
S02 | 李四 | D01 | 计算机系 | 1号楼 |
- 数据冗余:系名和系位置重复存储。
- 更新异常:修改系位置需更新所有相关元组。
- 插入/删除异常:新系无学生时无法插入,删除学生可能丢失系信息。
(二)函数依赖(数据依赖的核心)
- 定义:若X→Y,X值确定则Y值唯一确定(如学号→系号)。
- 分类:
- 部分依赖:AB→D,A→C(C依赖于A,而非整个AB键)。
- 传递依赖:A→B,B→C ⇒ A→C(C通过B传递依赖于A)。
(三)Armstrong公理(函数依赖推导规则)
规则 | 描述 | 示例 |
---|---|---|
自反律 | Y⊆X ⇒ X→Y | 学号,姓名→学号 |
增广律 | X→Y ⇒ XZ→YZ | 学号→系号 ⇒ 学号,课程号→系号 |
传递律 | X→Y,Y→Z ⇒ X→Z | 学号→系号,系号→系名 ⇒ 学号→系名 |
(四)候选键与范式(逐步优化关系模式)
范式 | 定义 | 核心要求 | 示例(学生表优化) |
---|---|---|---|
1NF | 属性不可再分 | 无重复列(如“高级职称人数”拆分为教授、副教授) | 原表:√(已满足原子性) |
2NF | 消除非主属性部分依赖 | 主键为复合键时,非主属性完全依赖主键 | 原表主键为学号(单一键),直接满足2NF |
3NF | 消除非主属性传递依赖 | 非主属性不依赖于其他非主属性 | 分解为学生表(学号,姓名,系号)和系表(系号,系名,系位置) |
BCNF | 每个决定因素含候选键 | 解决主属性间依赖(如STJ关系中S,J→T,T→J) | 分解为ST(S,T)和TJ(T,J) |
(五)模式分解判定
- 无损分解:自然连接可还原原表
条件:R1∩R2→R1-R2
或R1∩R2→R2-R1
(如R(ABC)分解为AB和AC,因A→B满足无损条件)。 - 保持函数依赖:分解后函数依赖集等价
例:R(ABC),F={A→B,B→C}分解为AB和BC,保留A→B和B→C,保持依赖。
四、数据控制:保障数据安全与可靠
(一)安全性措施(多层防护体系)
- 用户认证:密码、生物识别(最外层保护)。
- 存取控制:授权语句(如GRANT SELECT ON students TO ‘user’)。
- 视图保护:通过视图隐藏敏感字段(如只向第三方开放“姓名”而非“学号”)。
- 审计日志:记录所有数据库操作(用于追踪安全事件)。
(二)完整性约束(数据合法性保障)
- 实体完整性:主键非空(如学号不能为NULL)。
- 参照完整性:外键需引用存在的主键(如课程表的教师号需存在于教师表中)。
- 用户自定义:业务规则(如成绩必须在0-100之间)。
(三)并发控制(解决事务冲突)
- 三大问题:
- 丢失更新:两个事务同时修改同一数据,后提交覆盖前提交。
- 不可重复读:事务两次读取同一数据,结果不一致(因其他事务修改)。
- 脏读:读取到未提交的中间数据。
- 封锁协议:
- 一级:写操作加X锁(排它锁),解决丢失更新。
- 二级:读操作加S锁(共享锁),解决脏读。
- 三级:延长S锁持有时间,解决不可重复读。
(四)故障恢复(数据可靠性最后防线)
- 备份策略:
类型 特点 适用场景 恢复时间 冷备份 停机备份,文件级复制 非实时系统 较长(需重启数据库) 热备份 在线备份,支持事务 高可用性系统 秒级(需日志辅助) 增量备份 仅备份变化数据 数据量大时 依赖上次备份类型 - 日志文件:记录事务操作(如INSERT/UPDATE/DELETE),用于故障后重做(Redo)或回滚(Undo)。
- 故障处理:
- 事务故障:自动回滚(如算术溢出)。
- 系统故障:通过检查点(Checkpoint)恢复到最近一致状态。
- 介质故障:还原备份并应用日志重做所有提交事务。
五、综合应用:典型场景解析
(一)关系代数优化查询
问题:查询选修了课程且成绩大于80的学生姓名
步骤:
- 选择(σ成绩>80)→ 2. 投影(π姓名)→ 3. 自然连接学生表与成绩表
优势:通过代数运算明确逻辑步骤,便于数据库引擎优化执行计划。
(二)范式应用案例(学生选课表)
原表:SC(学号,课程号,成绩,学分)
- 问题:学分依赖课程号(部分依赖?不,主键是(学号,课程号),学分完全依赖课程号,属2NF但存在传递依赖?)
- 优化:分解为SC(学号,课程号,成绩)和Course(课程号,学分),满足3NF。
(三)故障恢复策略选择
场景:证券公司实时交易系统(7×24小时运行)
- 备份方案:热备份(动态备份)+ 增量日志备份(每15分钟)
- 理由:避免停机影响交易,增量备份减少存储压力,结合日志实现秒级恢复。
六、核心公式与定理速查表
知识点 | 公式/定理 | 说明 |
---|---|---|
自然连接 | R ⋈ S = π(σ(R.A=S.A)(R×S)) | 自动匹配公共属性并去重 |
无损分解条件 | R1∩R2→R1-R2 或 R1∩R2→R2-R1 | 判定分解能否还原原表 |
Armstrong公理 | 自反律、增广律、传递律 | 函数依赖推导基础 |
候选键查找 | 入度为0属性集+图遍历 | 确定最小标识属性集 |
七、学习建议
- 理论结合实践:通过MySQL/PostgreSQL实操关系代数(如用SELECT实现投影、WHERE实现选择)。
- 范式分步优化:每次分解后检查是否满足目标范式(从1NF到BCNF逐步验证)。
- 故障恢复演练:使用数据库备份工具(如pg_dump、mysqldump)模拟冷/热备份及恢复过程。
通过以上体系化梳理,可深入掌握数据库系统的核心原理,从理论设计到实际应用形成完整认知,为复杂数据管理场景提供解决方案。