关系模型概念
关系模型认为所有数据都可以表示为数学上的关系,即集合中两个元素之间的连接。
这一概念在关系型数据库中体现为数据表。数据表中的每一行保存一条记录称做tuple(元组),每一列表示数据记录的一个属性称做domain(域)。
每个数据都与一个记录和一个属性关联,即两者的关系。而数据表则是记录和属性的关系集。
Key
Super Key(超码): 是一个或多个属性的集合,可以唯一确定一条记录。
Candidate Key(候选码): 删除candidate key中任意一个属性都会使其失去唯一确定记录的特性。
Primary Key(主码): 从candidate key中选择一个作为对记录的唯一标识。
Foreign Key(外码): 关系模式R的属性A参照关系模式S的主键, 称A为R中的外键.
Primary Key中的属性称为主属性, 不在Primary Key中的属性称为非主属性.
Primary Key一般起约束作用,不能重复不能为空, 防止重复(unique)或无法查询(not null)的情况发生,称为实体完整性约束(Entity integrity)。
Forign Key用来用数据表S来保证数据表R的完整性,R中Foreign Key属性A参照关系S,则R.A中的值必须在S的主键中出现过, 称为参照完整性约束(Referential integrity)。
函数依赖
若在一张表中,在属性X的值确定的情况下,必定能确定属性Y的值,那么就可以说Y函数依赖于X,写作 X -> Y。
即在数据表中,任意两条记录,若它们在X属性上的值相同,则Y属性上的值一定相同。
函数依赖允许两条记录在X上的属性值不同,而在Y上的属性值相同的情况出现。
从函数依赖的角度来看,关系模式R的属性集A,存在A->R等价于A为R的超码.
完全函数依赖
完全函数依赖是针对X为多属性集合的情况定义的,若X->Y, 不存在X的任意非空真子集X'使得X'->Y则称:Y完全函数依赖于X。
若Y函数依赖于X,但不完全函数依赖于X则称:Y部分函数依赖于X。
传递函数依赖
若Y函数依赖于X,Z函数依赖于Y,则有Z传递函数依赖于X。
平凡函数依赖
若属性集Y属于X, 则有属性集Y函数依赖于X, 称这种函数依赖为平凡函数依赖.
如: A -> A, AB -> A
寻找所有候选码
根据属性在函数依赖集中出现的位置分为几类:
L属性: 出现且只出现在依赖关系的左侧
R属性: 出现且只出现在依赖关系的右侧
LR属性: 在依赖关系左右均出现过
N属性: 没有在依赖集中出现过
L和N属性一定是候选码的一部分, R属性一定不是候选码的成员, LR属性可能是候选码的一部分.
算法如下:
首先置集合H的初始元素为所有L和N属性.
集合I的初始元素所有为LR属性, 按元素数从少到多去其子集J.
判断\(R \cup J\)是否为候选码, 若是候选码则不再计算包含J的其它I的子集(一定有多余属性)
重复执行上一步,直至检查完所有I的子集.
检查某个属性集是否为候选码,可以利用数据依赖的公理化系统中计算属性集闭包的方法.
关系代数运算
关系代数运算是从一个关系集映射到另一个关系集的操作,包括6个基本关系代数运算。
- select选择(σ)
在表中选择满足条件的记录,保留其所有属性形成新的表。
- project投影(π)
在表中选择指定属性,取所有记录得到新表;重复的记录只保留一个,得到最终结果。
- union并(U)
将属性相同的两个表中的记录合并到同一个表中,属性不变。
- set difference集合差(-)
在属性相同的表r,s中选择所有r中有且s中没有的记录组成新表,属性不变。
- rename重命名(p)
对表中指定的属性重命名。
- Cartesian product笛卡儿积(*)
任意两个表r,s将它们的属性合并作为新表的domian,相同的属性进行重命名d->r.d,s.d。
表r中所有记录与s中的元组两两结合,形成新表的记录。
- division(除)
(1) 寻找R, S中的同名属性
(2)做R中其它属性列(X)到公共属性的像集
(3) 判断\(X_{i}\)的像集是否包含了S中所有Y的取值,若包含则将\(X_{i}\)加入到结果中
可以发现除法可以实现全程量词的功能, 请参见示例2.
在应用中还有一些常用运算,它们可以由基本运算导出:
- intersection 交
- θ-Join
θ为条件表达式,表r,s中共同属性相同且满足θ的记录将合并为新表的记录。
- Natural join(自然连接)
Natural Join是θ-Join的特例,表r,s的属性的并集作为新表的记录,共同属性相同的记录合并为新表的记录。
- Outer join (外连接)
左外连接:
r左连s,r与s的属性的并集作为新表的属性,并将r中所有记录添加到新表中。s中与r共同属性相同的记录添加到新表中。
右外连接与全外连接:
示例1: 在下面关系模式中找出余额最多的用户名
account(#user_id#, balance) user(user_id, username)
上式结果命名为max_account
当然, join可以用笛卡儿积和选择来实现.
示例2: 给出选课管理的关系模式
stu_cour(#stu_id, cour_id#) cour(#cour_id#, teach_id)
找出选了所有teach_id = 1
的教师任教的课程的学生学号:
来源:https://www.cnblogs.com/Finley/p/5284742.html