数据库系统设计与开发
一、关系数据库系统概述
数据:是对事物描述的符号记录,它描述事物中人们所感兴趣的特征,它能被计算机识别、存储和处理
数据管理:是对数据的分类、组织、编码、存储、查询和维护等活动,是数据处理的中心环节
数据管理的目标:
- 减少数据的冗余度(数据的重复存储)
- 提高数据的共享性(用户/语言/现在未来)
- 提高数据的独立性(应用程序独立于数据结构变化)
数据管理的三个阶段:人工 -> 文件 -> 数据库(60年代末)
数据库技术:数据管理的最新技术,研究数据库的结构、存储、管理和使用
DBS的组成:
- 数据库:以一定的组织形式(数据模型)存放在计算机存储设备上的相关数据的集合
- 数据库管理系统:管理数据库的软件
- 提供多种高级用户接口
- 查询处理和优化
- 数据的安全性控制
- 数据的完整性控制
- 并发控制
- 数据库恢复
- 数据目录(数据字典)管理
- 用户或应用程序
- 基于数据库的应用程序及用户
- 使用简单的终端命令会查询语言对数据库进行存取操作,即以查询性应用为主的用户
- 数据库管理员(DBA):进行数据库的规划、设计、协调、维护和管理的人员或集体
数据库系统的生存周期
- 数据库系统的规划
- 数据库设计
- 数据库的建立
- 数据库的运行、管理和维护
- 数据库的扩充和重构
开发数据库系统的有关人员
- 数据库管理员:进行数据库的规划、设计、协调、维护和管理
- 系统分析员:负责应用系统的需求分析和规范说明,与DBA和用户一起确定DBS的硬件平台和软件设置,参与DBS设计
- 程序设计员:负责设计和编制应用系统程序模块,并进行调试和安装
- 用户:参与可行性研究与需求分析
关系数据模型与关系模式
数据模型 -> 用来描述数据的一组概念和定义
三级数据模型
- 概念数据模型:面向客观世界,与DBMS无关(E-R)
- 逻辑数据模型:关系数据模型(面向用户和DBMS)
- 物理数据模型:与DBMS、OS和硬件有关
逻辑数据模型的三要素:
- 数据结构 -> 规定如何把基本的数据项组织成较大的数据单位
- 数据操作 -> 查询、更新(增、删、改);定义操作的含义、操作规则和实现操作的语言
- 数据约束 -> 是一组完整性规则的集合,定义了给定数据模型中数据及其联系所具有的制约和依赖规则
数据模式 -> 用数据模型对具体数据的描述
关系数据模型
- 关系数据库由关系组成(用二维表表示)
- 关系由元组组成(二维表的行),元组无序
- 元组由属性组成(二维表的列),属性无序
- 属性的取值范围 -- >属性域(原子数据的有限集)
- 数据间的关系用键(候选/主/主属性/外)隐含表示
关系中属性的个数 --> 关系的目
关系中元组的个数 --> 关系的基数
关系名+属性名 --> 关系模式
候选键:其属性或属性组的值能唯一决定其它所有属性的值,而它的任何真子集无此性质
- 主属性 ------- 包含在任何一个候选键中的属性
- 非主属性 ----- 不包含在任何一个候选集中的属性
主键(Primary Key(PK)):当一个关系能有多个候选键时,可选定一个来标识元组
外键(Foreign Key(FK)):(不是本关系的键)却引用了其它关系或本关系的键的属性或属性组
关系数据模型中表内不同元组间的联系用外键隐含地表示
关系数据模型中表间(实体间)的联系是用外键隐含地表示的
二、约束(四类)
- 域完整性 --> 属性域中的值/由语义决定可否为NULL
- 实体完整性 --> 每个关系都有一个主键、值唯一、≠NULL
- 引用完整性约束 --> 外键引用已有的主键值,或为NULL(非主属性作为主键)
- 一般化完整性约束 --> 由用户定义的、和数据的具体内容有关的约束
前三个称为隐含约束
后一个为显示约束(可用触发器、断言、过程)
属性为原子的 --> 固有约束
数据库中完整性约束检查,由DBMS实现或由用户负责
操作
查询是更新的基础
操作的对象及运算结果都是关系
关系代数完备集(σ,Π,∪, —, × )
σ:在关系中选出符号条件的元组(行)----> 水平分割(where)
Π:选取关系中感兴趣的列,可重排列顺序 -----> 对关系垂直分割(select)
×: 如:R x S :目为 r+s,基数为 基数R x 基数S
⋈:只保留一个关系中的公共属性
关系代数运算与SQL的QL的对应关系:
QL 的完整句法:
QL 的执行过程:
三、RDBMS 概述
1、层次结构:
- 应用层:应用程序与DBMS之间的接口,包括各种DB应用程序
- 语言翻译处理层:对数据库语言的各类语句进行语法分析、视图转换、授权检查、完整性检查、查询优化等
- 数据存取层:将上层的集合操作转换化为单元组操作,完成数据记录的存取、存取路径维护、并发控制、事务管理和数据库恢复等任务,涉及到数据字典的读与写、日志文件的读与写、加/解锁
- 数据存储层:负责文件的逻辑打开、关闭、读写页、读写缓冲等操作,并完成缓冲区管理、内外存交换和外存管理等任务
- 操作系统
- DB
2、DBMS的进程结构
- 一个应用进程对应一个DBMS核心进程
- 单进程多线程结构
- 系统只创建一个DBMS进程
- 在该进程中:有常驻的公共服务线程、用户线程
- 各个线程能在逻辑上并行执行,共享DBMS的资源
3、DBMS与DBS的结构
- 分时系统环境下的集中式数据库系统结构
- 网络环境下的客户/服务器结构(C/S)
- 物理上分布、逻辑上集中的分布式数据库结构
- 三层结构(B/S结构): Browser ---> web 服务器 ---> 数据库服务器
4、RDBMS功能的实现技术
一、必备的用户接口 --> SQL/非过程化数据库语言
- 交互式SQL:不能编程,访问为主(DDL、QL、DML、DCL)
- 嵌入式SQL:将SQL嵌入其它程序设计语言中,可处理数据
二、数据目录(数据字典或系统目录)
有关数据库中数据的定义和描述信息是 ---> 元数据
元数据组成的若干表 --> 数据目录
数据目录的内容:
- 基表、视图的定义
- 存取路径(索引、散列)
- 用于查询优化的统计数据
- 数据目录的定义和描述等
数据目录作用、定义方法、使用范围:
- 数据目录对DBMS的运行必不可少,DBMS频繁访问
- 数据目录本身不能用SQL语句定义,由系统在初始化生成,由DBMS维护
- DBMS一般不允许用户对之更新,只允许受控查询
- 数据目录中的基表的定义被删除,表中数据不能用
- 数据目录未定义,任何SQL语句都无法执行
三、查询处理与优化
- 数据库的存储结构
- 数据库的存储介质:多级
- 记录的存储结构
- 文件结构与存取路径:堆、散列、索引:动态(B+树)、静态(主索引,次索引)
- 查询优化的途径(可综合运用)
- 代数优化:改变基本操作的次序
- 依赖于存取路径的优化:结合存取路径(顺序扫描、索引、簇集)的分析考虑各操作的执行策略及选择原则
- 规则优化:仅根据启发式规则,选择执行的策略(先做选择、投影,后做连接操作等)
- 代价估算优化
四、并发控制
1)事务的概念
-
DBMS的最小执行单位,含有若干有序的操作
-
遵守ACID准则:原子性、一致性、隔离性、持久性
-
结束的方式:提交成功/失败 或 人为的故障
-
事务的定义和划分:(a)没有显式定义,则由DBMS按缺省规定自动划分事务
(b)用SQL语句显式控制一个事务的开始和终止
- 并发的概念
并发是不同用户(事务)同时访问同一数据的事件,是不同事务在时间上的交叉执行
3)事务并发执行可能带来的问题
不加控制 --> 三种冲突 -- > 三个问题 -- > 数据不一致
4)事务管理的任务 --> 保证事务的正常执行
- 满足ACID准则
- 在系统故障时应满足 --> 数据库恢复
- 在单事务执行时满足
- 在多事务并发执行时满足 -- > 并发控制
5)并发控制的正确性准则
-
调度的冲突可串行化(目前DBMS普遍采用)
-
采用锁机制:事务在操作前先对数据对象加锁
加锁时必须遵守的规则 -- > 加锁协议(相容矩阵)
几种有代表性的加锁协议:S锁(共享锁)、X锁(排它锁)、U锁(更新锁)
S锁:多个事务可封锁一个共享页;任何事务都不能修改该页; 通常是该页被读取完毕,S锁立即被释放
X锁:仅允许一个事务封锁此页;其他任何事务必须等到X锁被释放才能对该页进行访问;X锁一直到事务结束才能被释放
U锁:用来预定要对此页施加X锁,它允许其他事务读,但不允许再施加U锁或X锁;当被读取的页将要被更新时,则升级为X锁;U锁一直到事务结束时才能被释放
五、数据库恢复
-
故障的概念
起因:DBS 硬件、软件故障
现象:出现差错
后果:导致系统失效、数据丢失
DBS 的措施:增强系统可靠性
检查差错,将数据库恢复到某个一致状态
-
3种恢复技术
- 仅使用后备副本(脱机、增量转储、恢复用最近后备副本)
- 使用后备副本和日志文件(运行记录)
- 利用多个副本
六、E-R数据模型与E-R图(概念设计)
用E-R数据模型对现实世界抽象的结果用E-R图表示
三个抽象概念:实体、属性、联系
实体(矩形框):客观存在的且可以相互区分的事物
实体集:具有相同性质的实体的集合
联系(菱形框):实体集之间的相互关系(抽象表示)
联系的元数:与一个联系有关的实体集的个数
联系的类型:1:1、1:n、m:n
属性(椭圆):实体或联系所具有的特征
实体键(下画线):能够唯一标识实体集中某一实体的属性或属性组
七、逻辑设计
任务:
- 将概念结构转换为某个具体的DBMS所支持的逻辑结构
- 形成合理的全局逻辑结构(基表),并设计出外模式(视图)
- 对逻辑结构进行适当的调整和优化,使之在功能、完整性约束、可扩充性上满足用户需求
主要步骤:
概念设计结果 -- > 初始关系模式(E-R图转换成关系模式)
-
实体集
实体集 -- > 关系模式
实体属性 -- > 关系模式的属性 -- > 修改RDBMS不支持的类型
实体键 -- > 关系模式的键
-
联系
m : n 的联系集 -- > 用联系集的属性和两个实体集的键单独构成一个关系、新关系的键由两个实体集的键组合 而成、每个实体键是一个外键
1 :n 的联系集 -- > 联系集的属性归入 n 方关系模式中,并引用 1 方关系中的键,形成外键
1 : 1 的联系集 -- > 联系集的属性归入两个关系模式的任一个之中,并引入另一个关系的键,形成外键
多元联系集 -- > 联系集的属性与各关系模式的键构成新关系
-
将具有相同实体键的关系模式合并为一个关系模式
实例:
基于 E-R 图做逻辑设计,写出关系模式(单下划线表示主键,波浪线表示外键(此处用斜体表示 ,别问,问就是不知道咋表示波浪线))
两个实体对应两个模式,M : N联系对应一个模式
读者(借书证号,姓名,单位,职称)
图书(图书编号,分类号,书名,作者,出版单位,单价)
借阅(借书证号,图书编号,借阅日期)
八、函数依赖和关系模式的规范化
函数依赖
-
属性之间的约束关系 --> 数据依赖 --> 函数依赖
--> 多值依赖
-- > 连接依赖
-
函数依赖 -- > 一个或一组属性的值可以决定其它属性的值,是最基本的数据依赖
-
函数依赖的形式化定义 (X -> Y,表示 Y 函数依赖于 X)
-
函数依赖成立的条件
关系的任一可能指都满足(不仅是当前值)
-
平凡函数依赖与非平凡函数依赖
一个函数依赖 X -> Y 如果满足 Y ⊈ X,则为非平凡函数依赖,否则称之为平凡函数依赖
-
完全函数依赖与部分函数依赖
若 Y 函数依赖于 X,但不依赖于 X 的任何子句 X',则称 Y 完全函数依赖于 X,否则称 Y 部分函数依赖于 X
-
传递函数依赖
若关系的三个属性子集 X、Y、Z 之间有:
则称 Z 传递函数依赖于 X
-
逻辑蕴涵
对一个关系模式存在的多个函数依赖,可以通过推理,从一组已知的函数依赖导出另一组函数依赖,两个函数依赖集之间的这种关系称为逻辑蕴涵
-
闭包
所有被一个已知函数依赖集 F 逻辑蕴涵的那些函数依赖的集合为 F 的闭包
-
Armstrong 公理
- 自反律
- 扩展律
- 传递律
候选键
求属性集闭包算法可用于推导候选键
定义:
在关系模式R(U,F)中,若 X ⊆ U,Y ⊆ X, 且满足 X -> U, Y⇏U
则称 X 为 R 的候选键
方法:
-
若属性 A 仅出现在所有函数依赖的 右 部
则它一定不包含在任何候选键中
-
若属性 A 仅出现在所有函数依赖的 左 部
则它一定包含在某个候选键中
-
若属性 A 既出现在函数依赖的 右 部,又出现在 左 部,则它可能包含在候选键中
-
在上述基础上求属性集闭包
未出现函数依赖集中的属性一定是主属性
关系模式的规范化
-
规范化 -- 使关系模式满足某种条件
-
范式NF(Normal Form) -- 关系模式满足的条件
-
有多级范式,级别越高,条件越严格(共5级,1NF、2NF、3NF(BCNF) -- 模式设计、4NF、5NF -- 理论研究)
-
第一范式(1NF)
属性都是原子的关系模式满足第一范式
可记为 R ∈ 1NF(通常自动满足)
-
第二范式(2NF)
如果关系模式 R ∈ 1NF,且它的任一非主属性都完全函数依赖于任一候选键,则称 R 满足第二范式
记为 R ∈ 2NF
-
第三范式(3NF)
如果关系模式 R ∈ 2NF,且每一个非主属性不传递依赖于任一键
-> 各非主属性既不部分依赖也不传递依赖于键,记为 R ∈ 3NF
-
BCNF(Boyce-Codd范式)-- 改进的3NF
如果关系模式的所有非平凡函数依赖的决定子都含有键,记为 R ∈ BCNF
满足 BCNF 的关系可避免更新异常和数据冗余
若 R ∈ BCNF,则 R ∈ 3NF
-
-
关系模式的分解
- 模式分解
- 分解目的:使关系达到某级范式
- 分解准则:无损、保持依赖
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端