2 关系数据库
本文最后更新于:2025年10月23日 上午
一、关系数据库发展与理论基础
(一)核心奠基人及贡献
E.F.Codd(IBM公司)是关系数据库理论的核心奠基人,其关键贡献如下:
- 1970年:在《Communication of the ACM》发表论文,提出关系数据模型,为关系数据库奠定基础。
- 后续研究:提出关系代数、关系演算概念,构建关系数据库的数学运算体系。
- 范式理论:1972年提出第一、二、三范式(1NF、2NF、3NF),1974年提出BC范式,解决数据冗余与异常问题。
- 荣誉:因对关系数据库理论的开创性贡献,获1981年ACM图灵奖。
(二)理论基础与代表系统
- 数学基础:关系理论建立在集合代数理论之上,确保逻辑严谨性。
- 早期代表系统:
- System R:由IBM研制,是关系数据库技术的重要早期实践。
- INGRES:由加州Berkeley分校研制,推动关系数据库的学术与工业应用。
- 主流商业数据库:
- 大型数据库:Oracle、Informix、Sybase、SQL Server、DB2,适用于企业级海量数据存储与处理。
- 小型数据库:Access、Foxpro、Foxbase,多用于个人或小型团队的数据管理。
二、关系数据结构及形式化定义
(一)核心概念与定义
-
域(Domain)
- 定义:一组具有相同数据类型的值的集合,是属性的取值范围。
- 示例:整数集、{'男','女'}、长度为10的字符串集合、0-100的整数区间。
-
笛卡尔积(Cartesian Product)
- 定义:给定域D₁,D₂,...,Dₙ,其笛卡尔积为所有域取值的无重复组合,记为D₁×D₂×...×Dₙ。
- 性质:
- 结果为n元组集合,每个元组(d₁,d₂,...,dₙ)中dᵢ∈Dᵢ。
- 可表示为二维表:每行对应一个元组,每列对应一个域。
- 示例:若D₁={t1,t2}(教师)、D₂={s1,s2,s3}(学生)、D₃={c1,c2}(课程),则笛卡尔积包含(t1,s1,c1),(t1,s1,c2),...,(t2,s3,c2)共2×3×2=12个元组。
-
关系(Relation)
- 定义:笛卡尔积的有意义子集,记为R(D₁,D₂,...,Dₙ),其中R为关系名,n为关系的"度/目"。
- 核心属性:
- 元组(Tuple):关系中的每个元素(对应二维表的行),如(t1,s1,c1)。
- 分量(Component):元组中的每个值(对应表中单元格),如t1、s1。
- 基数(Cardinal number):关系中的元组个数,若域Dᵢ基数为mᵢ,则笛卡尔积基数为M=∏mᵢ,关系基数≤M。
- 属性(Attribute):关系中每列的名称(因不同列可能来自同一域,需命名区分),n目关系必有n个属性。
-
码(Key)
- 候选码(Candidate Key):能唯一标识元组的最小属性组(去掉任一属性则失去唯一性),如"学号"可作为学生关系的候选码。
- 主码(Primary Key):从多个候选码中选定的"唯一标识",用于数据库操作中的定位,如学生关系中选"学号"为主码。
- 全码(All-key):关系的所有属性组构成候选码,仅在特殊场景(如多实体无单一标识属性的联系)中存在,如"教师-学生-课程"联系表可能以(教师编码,学生学号,课程号)为全码。
- 外部码(Foreign Key):关系R中的属性组,非R的码,但与关系S的主码对应,用于建立关系间的关联,如"学生"表的"学院号"是"学院"表"学院号"的外码。
-
三类关系
- 基本关系(基表):实际存储数据的逻辑表,对应现实世界的实体集(如"学生表""课程表")。
- 查询表:查询结果生成的临时表,不长期存储。
- 视图表:由基表或其他视图导出的"虚表",仅存储定义,不存储数据,查询时动态计算。
(二)关系的性质
- 列同质:每列分量来自同一域,且属性名唯一。
- 行无序:元组的顺序不影响数据逻辑(集合特性)。
- 元组唯一:任意两个元组的候选码不同(无重复元组)。
- 分量不可再分:满足第一范式(1NF),即每个单元格不能包含多个值或子结构(如"地址"不能拆分为"省+市"存储在同一单元格)。
(三)关系模式与关系数据库
-
关系模式(Relation Schema)
- 定义:对关系的静态描述,包含元组结构、完整性约束、属性依赖,形式化表示为R(U,D,DOM,F):
- R:关系名;U:属性名集合;D:属性对应的域;DOM:属性到域的映象;F:属性间数据依赖。
- 简记形式:R(A₁,A₂,...,Aₙ)(如学生模式S(学号,姓名,性别,学院号))。
- 与关系的区别:关系模式是"型"(静态结构),关系是"值"(某时刻的实际数据,动态变化)。
- 定义:对关系的静态描述,包含元组结构、完整性约束、属性依赖,形式化表示为R(U,D,DOM,F):
-
关系数据库(Relation Database)
- 型(内涵):关系数据库模式,包含域定义和若干关系模式。
- 值(外延):某时刻所有关系的集合,即实际存储的数据。
三、关系操作
(一)常用操作分类
- 查询操作(核心):
- 基本操作:选择、投影、并、差、笛卡尔积(5种,构成其他查询的基础)。
- 扩展操作:交、连接(等值/自然连接)、除、广义投影、外连接、聚集。
- 数据更新:插入、删除、修改。
(二)操作特点
- 集合操作:操作对象和结果均为集合(一次一集合),区别于非关系型数据库的"一次一记录"。
(三)关系数据语言
-
语言特点:
- 一体化:集数据定义(DDL)、数据操纵(DML)、数据控制(DCL)于一体,操作对象统一为关系。
- 非过程化:用户只需说明"做什么"(目标),无需指定"怎么做"(执行路径,由系统自动优化)。
- 面向集合:操作结果为关系,支持复杂关联查询。
-
语言分类:
- 关系代数:用"运算"表达查询(如选择、投影),需指明操作步骤。
- 关系演算:用"谓词"描述查询目标(如元组演算、域演算),无需说明步骤。
四、关系的完整性
关系模型通过完整性约束确保数据正确性、一致性,分为三类:
(一)实体完整性(Entity Integrity)
- 规则:基本关系的主属性不能取空值(空值表示"未知"或"无意义")。
- 理由:主属性是实体的唯一标识,空值会导致实体无法区分(如学生表"学号"不能为空)。
(二)参照完整性(Referential Integrity)
-
规则:若F是关系R的外码(对应关系S的主码Kₛ),则R中F的取值只能是:
- 空值(若F允许空);
- S中某元组的Kₛ值(确保引用的实体存在)。
-
示例:
- 学生表"学院号"(外码)只能取学院表中存在的"学院号",或空值(未分配学院)。
- 选修表"学号"(外码)必须取学生表中存在的"学号"(因"学号"是选修表的主属性,不允许空)。
-
违约处理:
- 拒绝执行:默认策略(如插入不存在"学院号"的学生,直接拒绝)。
- 级联操作:删除/修改被参照表元组时,同步删除/修改参照表关联元组(如删除学生时,级联删除其选修记录)。
- 设置为空值:删除/修改被参照表元组时,将参照表外码设为空(仅适用于外码允许空的场景)。
(三)用户定义的完整性(User-Defined Integrity)
- 定义:针对具体应用的语义约束,如"性别只能是男/女""成绩范围0-100""年龄≥16"。
- 实现:由数据库系统提供机制(如CHECK约束),避免由应用程序单独处理,确保一致性。
五、关系代数(重点)
以"学生-课程"数据库(S:学生,C:课程,SC:选修)为例,说明核心运算:
(一)基本运算
-
选择(σ):从关系中筛选满足条件的元组(行过滤)。
- 公式:σ_F(R)={t|t∈R且F(t)为真}(F为条件表达式,如σ_性别='男'(S))。
- 示例:查询IS系学生:σ_学院号='IS'(S)。
-
投影(Π):从关系中选取指定属性,去除重复元组(列过滤)。
- 公式:Π_A(R)={t[A]|t∈R}(A为属性集合)。
- 示例:查询所有学生的姓名和学院:Π_姓名,学院号(S)。
-
并(∪):两个相容关系(同元、同域)的元组集合合并,去重。
- 公式:R∪S={t|t∈R或t∈S}。
- 示例:查询选修1号或2号课程的学生号:Π_学号(σ_课程号=1(SC))∪Π_学号(σ_课程号=2(SC))。
-
差(−):从R中去除属于S的元组。
- 公式:R−S={t|t∈R且t∉S}。
- 示例:查询选修1号但未选修2号课程的学生号:Π_学号(σ_课程号=1(SC))−Π_学号(σ_课程号=2(SC))。
-
笛卡尔积(×):两个关系的元组所有可能组合(行数=R行数×S行数,列数=R列数+S列数)。
- 公式:R×S={tᵣtₛ|tᵣ∈R且tₛ∈S}(tᵣtₛ表示元组连串)。
- 示例:学生表与课程表的笛卡尔积S×C,包含所有"学生-课程"组合(需通过条件过滤有效关联)。
(二)扩展运算
-
交(∩):两个相容关系的共同元组,可由差运算推导(R∩S=R−(R−S))。
- 示例:查询同时选修1号和2号课程的学生号:Π_学号(σ_课程号=1(SC))∩Π_学号(σ_课程号=2(SC))。
-
连接(Join):
- 定义:从笛卡尔积中筛选属性满足条件的元组,分为:
- θ连接:筛选R.AθS.B(θ为比较符,如>、=)的元组。
- 等值连接:θ为"="的连接(筛选属性值相等的元组,保留重复列)。
- 自然连接:等值连接的特殊形式,连接属性名相同且去除重复列(最常用)。
- 示例:查询学生及其选修课程:S⋈SC(自然连接,通过"学号"关联)。
- 定义:从笛卡尔积中筛选属性满足条件的元组,分为:
-
除(÷):
- 定义:若R(X,Y)、S(Y,Z),则R÷S是R中"X的象集包含S中Y投影"的元组在X上的投影(适用于"包含所有"的查询)。
- 示例:查询选修所有课程的学生号:Π_学号,课程号(SC)÷Π_课程号(C)。
-
外连接(Outer Join):
- 解决自然连接中"失配元组丢失"问题,分为:
- 左外连接(R⋈_左 S):保留R中所有元组,S中无匹配的元组填空。
- 右外连接(R⋈_右 S):保留S中所有元组,R中无匹配的元组填空。
- 全外连接(R⋈_全 S):保留R和S中所有元组,无匹配的填空。
- 示例:查询所有教师及其授课信息(包括无授课任务的教师):教师表⋈_左 授课表。
- 解决自然连接中"失配元组丢失"问题,分为:
-
聚集(Aggregation):对属性值进行统计计算,常用函数:
- sum(求和)、avg(平均)、count(计数)、max(最大值)、min(最小值)。
- 分组聚集:按指定属性分组后,对每组应用聚集函数(如"按学号分组,求平均成绩")。
- 示例:查询每位学生的平均成绩:学号G avg(成绩)(SC)。
六、视图(View)
(一)定义与特性
- 定义:命名的查询语句(虚表),语法:
create view 视图名 as <查询表达式>。 - 特性:不存储数据,仅存储定义;查询视图时,动态执行底层查询。
(二)优点
- 简化查询:将复杂查询封装为视图,用户直接查询视图(如"教师授课视图"封装教师、授课、课程表的连接)。
- 数据安全:限制用户访问的属性或行(如"学生成绩视图"仅显示"姓名+课程名+成绩",隐藏"学号")。
- 逻辑独立性:若基表结构变化,可通过修改视图定义,不影响用户查询(如基表"学院号"改为"部门号",视图中映射为"学院号")。
(三)物化视图(Materialized View)
- 定义:存储视图查询结果的"实表",定期或触发更新以保持与基表一致。
- 应用场景:查询频繁、计算复杂的场景(如"商品月度销量统计"),提升查询效率。
七、完整性检查与违约处理
(一)实体完整性检查
- 触发时机:插入或更新主属性时。
- 检查内容:
- 主码值是否唯一(通过全表扫描或索引扫描)。
- 主属性是否为空。
- 违约处理:拒绝插入或更新。
(二)参照完整性检查
- 触发时机:插入/更新参照表、删除/更新被参照表。
- 违约处理:拒绝执行、级联操作、设置为空(根据业务需求配置)。
(三)用户定义完整性检查
- 触发时机:插入或更新属性时。
- 检查内容:是否满足语义约束(如成绩范围、性别取值)。
- 违约处理:拒绝操作。
2 关系数据库
https://hellowydwyd.github.io/2025/10/23/2-关系数据库/