数据库系统(一)基础知识与关系模型
列/字段/属性/数据项
行/元组/记录
关系第一范式:属性不可再分特性
候选码/候选键:关系中的一个属性组,其值能唯一标识一个元组,若从该属性组中去掉任何一个属性,它就不具有这一性质了,这样的属性组称作候选码。
有时,关系中有很多组候选码,例如:
学生(S#, Sname, Sage, Sclass, Saddress)
其中属性S#是候选码,属性组(Sname, Saddress)也是候选码(同名同地址的两个同学是不存在的)
再如
Employee(EmpID, EmpName, Mobile)
每一雇员有唯一的EmpID, 没有两个雇员有相同的手机号Mobile, 则
EmpID是候选码,Mobile也是候选码
主码(Primary Key)/主键
- 当有多个候选码时,可以选定一个作为主码。
- DBMS以主码为主要线索管理关系中的各个元组。
- 例如可选定属性S#作为“学生”表的主码,也可以选定属性组(Sname, Saddress)作为“学生”表的主码。选定EmpID为Employee的主码。
主属性与非主属性
- 包含在任何一个候选码中的属性被称作主属性,而其他属性被称作非主属性
- 如 “选课”中的S# , C#为主属性,而Sname, Cname, Grade则为非主属性;
- 最简单的,候选码只包含一个属性
- 最极端的,所有属性构成这个关系的候选码,称为全码(All-Key)。
- 比如:关系“教师授课”(T#,C#)中的候选码(T#,C#)就是全码。
外码(Foreign Key)/外键
- 关系R中的一个属性组,它不是R的候选码,但它与另一个关系S的候选码相对应,则称这个属性组为R的外码或外键。
- 例如“合同”关系中的客户号不是候选码,但却是外码。因它与“客户”关系中的候选码“客户号” 相对应。
- 两个关系通常是靠外码连接起来的。
关系模型中的完整性
实体完整性
- 关系的主码中的属性值不能为空值;
- 空值:不知道或无意义的值;
- 意义:关系中的元组对应到现实世界相互之间可区分的一个个个体,这些个体是通过主码来唯一标识的;若主码为空,则出现不可标识的个体,这是不容许的。
参照完整性
- 如果关系R1的外码Fk与关系R2的主码Pk相对应,则R1中的每一个元组的Fk值或者等于R2 中某个元组的Pk 值,或者为空值
- 意义:如果关系R1的某个元组t1参照了关系R2的某个元组t2,则t2必须存在
例如关系Student在D#上的取值有两种可能:- 空值,表示该学生尚未分到任何系中
- 若非空值,则必须是Dept关系中某个元组的D#值,表示该学生不可能分到一个不存在的系中
用户自定义完整性
- 用户针对具体的应用环境定义的完整性约束条件
- 如S#要求是10位整数,其中前四位为年度,当前年度与他们的差必须在4以内
DBMS对关系完整性的支持
- 实体完整性和参照完整性由DBMS系统自动支持
- DBMS系统通常提供了如下机制:
(1)它使用户可以自行定义有关的完整性约束条件
(2)当有更新操作发生时,DBMS将自动按照完整性约束条件检验更新操作的正确性,即是否符合用户自定义的完整性
关系模型之关系代数
(1)集合操作
(2)纯关系操作
关系代数之基本操作
某些关系代数操作,如并、差、交等,需满足“并相容性”
并相容性
参与运算的两个关系及其相关属性之间有一定的对应性、可比性或意义关联性
定义:关系R与关系S存在相容性,当且仅当:
(1) 关系R和关系S的属性数目必须相同;
(2) 对于任意i,关系R的第i个属性的域必须和关系S的第i个属性的域相同
假设:R(A1, A2, … , An) , S(B1, B2, … ,Bm)R和S满足并相容性:n = m 并且 Domain(Ai) = Domain(Bi)
并(Union)
- 定义:假设关系R和关系S是并相容的,则关系R与关系S的并运算结果也是一个关系,记作:R ∪S, 它由或者出现在关系R中,或者出现在S中的元组构成。
- 数学描述: R ∪S ={ t | t∈R $\lor$ t∈S } ,其中t是元组
- 并运算是将两个关系的元组合并成一个关系,在合并时去掉重复的元组。
- R ∪S 与 S ∪R 运算的结果是同一个关系
差(Difference)
- 定义:假设关系R 和关系S是并相容的,则关系R 与关系S 的差运算结果也是一个关系,记作:R - S, 它由出现在关系R中但不出现在关系S中的元组构成。
- 数学描述: R - S ={ t | t∈R $\land$ t $\notin$ S } ,其中t是元组
- R - S 与 S - R 是不同的
广义笛卡尔积 (Cartesian Product)
定义:关系R (<a1 , a2, …, an >) 与关系S(<b1, b2, …, bm >) 的广义笛卡尔积(简称广义积,或 积 或笛卡尔积) 运算结果也是一个关系,记作: R x S, 它由关系R中的元组与关系S的元组进行所有可能的拼接(或串接)构成。
数学描述: R x S ={ <a1 , a2, …, an, b1, b2, …, bm> | <a1 , a2, …, an > $\in\land$<b1, b2, …, bm> $\in$ S }
R x S = S x R : R x S为R中的每一个元组都和S中的所有元组进行串接。 S x R为S中的每一个元组都和R中的所有元组进行串接。结果是相同的。
两个关系R和S,它们的属性个数分别为n和m(R是n度关系,S是m度关系)
则笛卡尔积 R x S的属性个数 = n + m。即元组的前n个分量是R中元组的分量,后m个分量是S中元组的分量(R x S是n+m度关系).
两个关系R和S,它们的元组个数分别为x和y(关系R的基数x, S的基数y),
则笛卡尔积R x S的元组个数 =x * y。(R x S的基数是x * y).
选择(Select)
- 定义:给定一个关系R, 同时给定一个选择的条件condition(简记con), 选择运算结果也是一个关系,记作$\sigma$con(R) , 它从关系R中选择出满足给定条件condition的元组构成。
- 数学描述: $\sigma$con(R)={t | t (R)={t | t $\in$ R $\land$ con(t) = con(t) = ‘真’} ,
- 设R(A1 ,A2 , … ,An), t是R的元组, t 的分量记为t[Ai], 或简写为Ai
- 条件con由逻辑运算符连接比较表达式组成
- 逻辑运算符: $\land,\lor,\neg$ 或写为 and , or, not
- 比较表达式:X $\theta$ Y, 其中X, Y 是t的分量、常量或简单函数, $\theta$是比较运算符, $\theta \in { >,\ \geq,\ <,\ \leq,\ =,\ \neq }$
投影(Project)
定义:给定一个关系R, 投影运算结果也是一个关系,记作 $ \Pi_{A}(R) $, 它从
关系R中选出属性包含在A中的列构成。数学描述: $$ \Pi_{A_{i1}, A_{i2}, \ldots, A_{ik}}(R) = \left{ \langle t[A_{i1}], t[A_{i2}], \ldots, t[A_{ik}] \rangle \mid t \in R \right} $$
设R(A1 ,A2 , … ,An)
{ Ai1, Ai2, … ,Aik } { A1 ,A2 , … ,An }
t[Ai]表示元组t中相应于属性Ai的分量
投影运算可以对原关系的列在投影后重新排列
投影操作从给定关系中选出某些列组成新的关系, 而选择操作是从给定关系中选出某些行组成新的关系
如果投影后有重复元组,则应去掉
用户可以根据需要通过投影、选择操作查询他所关心的数据信息。
关系代数之扩展操作
交(Intersection)
- 定义:假设关系R和关系S是并相容的,则关系R与关系S的交运算结果也是一个关系,记作:R ∩S, 它由同时出现在关系R和关系S中的元组构成。
- 数学描述: R∩S ={ t | t∈R $\land$ t∈S } ,其中t是元组 R∩S 和 S∩R 运算的结果是同一个关系
- 交运算可以通过差运算来实现:
R ∩ S = R - (R - S) = S - (S - R)
$\theta$-连接($\theta$-Join, theta-Join)
- 投影与选择操作只是对单个关系(表)进行操作, 而实际应用中往往涉及多个表之间的操作, 这就需要连接操作
- 比如:查询数据结构成绩在90分以上的学生姓名(涉及Student, Course, SC)
- 定义:给定关系R和关系S, R与S的连接运算结果也是一个关系,记作$R\bowtie S$ ,它由关系R和关系S的笛卡尔积中, 选取R中属性A与S中属性
B之间满足$\theta$ 条件的元组构成。 - 数学描述:$$ R \times S = \sigma_{t[A]\ \theta\ s[B]}(R \times S) $$
- 设R(A1 ,A2 , … ,An), A { A1 ,A2 , … ,An }
S(B1 ,B2 , … ,Bm), B { B1 ,B2 , … ,Bm }
t是关系R中的元组,s是关系S中的元组
属性A和属性B具有可比性
等值连接(Equi-Join)
- 定义:给定关系R和关系S, R与S的等值连接运算结果也是一个关系,记作 ,它由关系
R和关系S的笛卡尔积中选取R中属性A与S中属性B上值相等的元组所构成。
自然连接(Natural-Join)
- 定义:给定关系R和关系S, R与S的自然连接运算结果也是一个关系,记作 ,它由关系R和关系S的笛卡尔积中选取相同属性组B上值相等的元组所构成。
关系代数之复杂扩展操作
除(Division)
外连接(Outer-Join)
- 定义:两个关系R与S进行连接时,如果关系R(或S)中的元组在S(或R)中找不到相匹配的元组,则为了避免该元组信息丢失,从而将该元组与S(或R)中假定存在的全为空值的元组形成连接,放置在结果关系中,这种连接称之为外连接(Outer Join)。
- 外连接 = 自然连接 (或连接) + 失配的元组(与全空元组形成的连接)
- 外连接的形式:左外连接、右外连接、全外连接
- 左外连接 = 自然连接(或连接) + 左侧表中失配的元组
- 右外连接 = 自然连接(或连接) + 右侧表中失配的元组
- 全外连接 = 自然连接(或连接) + 两侧表中失配的元组
关系运算的安全性
“不产生无限关系和无穷验证的运算被称为是安全的”
关系代数是一种集合运算,是安全的
- 集合本身是有限的,有限元素集合的有限次运算仍旧是有限的。
关系演算不一定是安全的
关系运算有三种:关系代数、关系元组演算和关系域演算
- 三种关系运算都是抽象的数学运算,体现了三种不同的思维
- 关系代数—以集合为对象的操作思维,由集合到集合的变换
- 元组演算—以元组为对象的操作思维,取出关系的每一个元组进行验证,有一个元组变量则可能需要一个循环,多个元组变量则需要多个循环
- 域演算—以域变量为对象的操作思维,取出域的每一个变量进行验证看其是否满足条件
三种运算之间是等价的
- 关系代数 与 安全的元组演算表达式 与 安全的域演算表达式 是等价的。即一种形式的表达式可以被等价地转换为另一种形式
- 三种关系运算都可说是非过程性的
- 相比之下:域演算的非过程性最好,元组演算次之,关系代数最差
- 三种关系运算虽是抽象的,但却是衡量数据库语言完备性的基础
- 一个数据库语言如果能够等价地实现这三种关系运算的操作,则说该语言是完备的
- 目前多数数据库语言都能够实现这三种运算的操作,在此基础上还增加了许多其他的操作,如赋值操作、聚集操作等