博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关系模型
阅读量:6099 次
发布时间:2019-06-20

本文共 2279 字,大约阅读时间需要 7 分钟。

关系模型概念

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

这一概念在关系型数据库中体现为数据表。数据表中的每一行保存一条记录称做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选择(σ)

在表中选择满足条件的记录,保留其所有属性形成新的表。

qoXWbp1.png

  • project投影(π)

在表中选择指定属性,取所有记录得到新表;重复的记录只保留一个,得到最终结果。

H8ddJC2.png

  • union并(U)

将属性相同的两个表中的记录合并到同一个表中,属性不变。

VDKNVNA.png

  • set difference集合差(-)

在属性相同的表r,s中选择所有r中有且s中没有的记录组成新表,属性不变。

ILQzhz1.png

  • rename重命名(p)

对表中指定的属性重命名。

793413-20160627214849577-771638576.png

  • Cartesian product笛卡儿积(*)

任意两个表r,s将它们的属性合并作为新表的domian,相同的属性进行重命名d->r.d,s.d。

表r中所有记录与s中的元组两两结合,形成新表的记录。

vu4rlNh.png

  • division(除)

793413-20160704141346452-35946217.png

(1) 寻找R, S中的同名属性

793413-20160704143956983-1070065502.png

(2)做R中其它属性列(X)到公共属性的像集

793413-20160704144608921-1477015032.png

(3) 判断\(X_{i}\)的像集是否包含了S中所有Y的取值,若包含则将\(X_{i}\)加入到结果中

793413-20160704144815546-1109533228.png

可以发现除法可以实现全程量词的功能, 请参见示例2.


在应用中还有一些常用运算,它们可以由基本运算导出:

  • intersection 交

QuEzQ3Y.png

  • θ-Join

θ为条件表达式,表r,s中共同属性相同且满足θ的记录将合并为新表的记录。

53dffk5.png

  • Natural join(自然连接)

Natural Join是θ-Join的特例,表r,s的属性的并集作为新表的记录,共同属性相同的记录合并为新表的记录。

  • Outer join (外连接)

左外连接:

r左连s,r与s的属性的并集作为新表的属性,并将r中所有记录添加到新表中。s中与r共同属性相同的记录添加到新表中。

3dVU3ng.png

右外连接与全外连接:

XGD5Hwk.png


示例1: 在下面关系模式中找出余额最多的用户名

account(#user_id#, balance)user(user_id, username)

793413-20160627215754249-1547023144.png

上式结果命名为max_account

793413-20160627220229812-657557977.png

当然, join可以用笛卡儿积和选择来实现.

示例2: 给出选课管理的关系模式

stu_cour(#stu_id, cour_id#)cour(#cour_id#, teach_id)

找出选了所有teach_id = 1的教师任教的课程的学生学号:

793413-20160704145745171-1501203783.png

转载地址:http://amfza.baihongyu.com/

你可能感兴趣的文章
多线程条件
查看>>
Git [remote rejected] xxxx->xxxx <no such ref>修复了推送分支的错误
查看>>
Porter/Duff,图片加遮罩setColorFilter
查看>>
黄聪:VMware安装Ubuntu10.10【图解】转
查看>>
Centos 6.x 升级openssh版本
查看>>
公式推♂倒题
查看>>
vue实现点击展开,点击收起
查看>>
如何使frame能居中显示
查看>>
第k小数
查看>>
构建之法阅读笔记三
查看>>
Python/PHP 远程文件/图片 下载
查看>>
【原创】一文彻底搞懂安卓WebView白名单校验
查看>>
写给对前途迷茫的朋友:五句话定会改变你的人生
查看>>
并行程序设计学习心得1——并行计算机存储
查看>>
JAVA入门到精通-第86讲-半双工/全双工
查看>>
bulk
查看>>
js document.activeElement 获得焦点的元素
查看>>
abb画学号
查看>>
C++ 迭代器运算
查看>>
【支持iOS11】UITableView左滑删除自定义 - 实现多选项并使用自定义图片
查看>>