关系模型

关系模型概念

关系模型认为所有数据都可以表示为数学上的关系,即集合中两个元素之间的连接。

这一概念在关系型数据库中体现为数据表。数据表中的每一行保存一条记录称做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属性可能是候选码的一部分.

算法如下:

  1. 首先置集合H的初始元素为所有L和N属性.

  2. 集合I的初始元素所有为LR属性, 按元素数从少到多去其子集J.

  3. 判断(R cup J)是否为候选码, 若是候选码则不再计算包含J的其它I的子集(一定有多余属性)

  4. 重复执行上一步,直至检查完所有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