zoukankan      html  css  js  c++  java
  • 关系模型

    关系模型概念

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

    这一概念在关系型数据库中体现为数据表。数据表中的每一行保存一条记录称做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的教师任教的课程的学生学号:

  • 相关阅读:
    如何保证access_token长期有效
    微信自定义菜单的创建
    是否同一棵二叉搜索树
    Tree Traversals Again(根据前序,中序,确定后序顺序)
    List Leaves 树的层序遍历
    leetcode-优美的排列
    leetcode-下一个排列
    leetcode-二进制手表
    leetcode-组合总数III(回溯)
    leetcode-累加数(C++)
  • 原文地址:https://www.cnblogs.com/Finley/p/5284742.html
Copyright © 2011-2022 走看看