• Click to hide sidebar
  • Click to show sidebar
  • 数据库 - 课程笔记

    Course notes about Database

    数据库系统

    关系模型和SQL

    关系代数

    selection:

    从表中选择一些行

    σcondition(tablename)\sigma_{condition}(table_name)

    projection

    从表中选择一些列

    πcolumlist(tablename)\pi_{colum_list}(table_name)

    join:

    RR.a=S.bSR\bowtie_{R.a = S.b}S

    重命名:ρ\rho

    除:

    A/B,假设A(x,y), B(y),则A/B=xyB,(x,y)AA/B={x|\forall y \in B, (x, y) \in A}

    分组运算:γgroup,form[renamecol](table)\gamma_{group, form[\rightarrow rename_col]}(table)

    授权图:

    (授权者,被授权者,权限,yes/no)

    数据冗余与依赖关系

    范式

    每种范式消除了一种冗余

    1NF:所有属性(列)都是原子类型

    2NF:消除函数依赖中的部分依赖

    3NF:消除函数依赖中的非键传递依赖

    BNF:消除所有函数依赖

    4NF:消除多值依赖

    5NF:消除连接依赖

    函数依赖(FD)

    R(U)R(U)为属性集UU上的一个关系模式,XU,YUX\subseteq U, Y\subseteq U

    函数依赖XYX\rightarrow Y:任意两个元组在X上取值相同,则他们在Y上取值也相同

    候选键:一种特殊的函数依赖

    XUX\subseteq U为候选键,若满足:

    1. XUX\rightarrow U
    2. YX,YU\forall Y\subseteq X, Y\nrightarrow U(X为最小的)

    超键只满足第一个条件

    函数依赖的推导:

    Armstrong规则:

    • 自反律:若YXY\subseteq XXYX\rightarrow Y

    • 增补律:若XYX\rightarrow Y,则对任意Z,XZYZZ, XZ\rightarrow YZ

    • 传递律:若XYX\rightarrow YYZY\rightarrow Z,则XZX\rightarrow Z

    • 分解:若XYZX\rightarrow YZ,则XY,XZX\rightarrow Y, X\rightarrow Z

      • 证明:XYZ,YZY,XYX\rightarrow YZ, YZ \rightarrow Y, X\rightarrow Y
    • 合并:若XY,XZX\rightarrow Y, X\rightarrow Z,则XYZX\rightarrow YZ

      • 证明:XZ,XXZ,XY,XZYZ,XYZX\rightarrow Z, X\rightarrow XZ, X\rightarrow Y, XZ\rightarrow YZ, X\rightarrow YZ

    分解和合并等价,因此只需找出但一属性的函数依赖关系则可得所有,但列举自反律、增补律无意义

    求必报重点是传递律,创建条件可使用另两

    函数依赖F的闭包

    属性集的闭包算法:

    1
    2
    3
    4
    5
    6
    7
    8
    
    closure  = X;
    do{
        changed = false;
        if(exists(Y\rightarrow Z\in F)) and (Y\subseteq closure) and !(Z\subseteq closure){
            closure = closure\bigcup Z;
            changed = truel
        }
    }while(changed);
    

    属性集X\rightarrow单个属性A

    1. 类型1:平凡依赖:AX{A}\subseteq X,无数据冗余

    X, A与键的关系:

    X: 超键;为候选键的一部分;包含非键的属性,且X不是超键

    A: 非键;键

    1. 类型2:X为超键(包括候选键),无数据冗余

    2. 部分依赖:X为候选键的一部分,A非键

      • 2NF
    3. 非键传递依赖:X包含非键的属性,X不是超键,A为非键属性

      • 3NF
    4. 对键属性的函数依赖:X不为超键,A为键属性

      • BNF

    判断关系模式是否满足xNF:

    1. 找出所有的函数依赖关系
    2. 查看是否包含:
      • 部分依赖:
        • Y: 1NF break, N: 2NF continue
      • 非键传递依赖:
        • Y, break, N: 3NF continue
      • 键属性函数依赖
        • N: BNF

    关系模式分解

    无损分解:对R进行X和Y的分解是无损的,当且仅当:

    • 分解后两个表的自然连接可以得到原表

    可证:若R1R2=RR1\bigcup R2=RR1R2R1R1\bigcap R2\rightarrow R1,则对R进行R1和R2的分解无损

    R1R2R1\bigcap R2为join key,因此为R1的主键,R2的外键

    BCNF通过关系模式的无损分解

    XAX\rightarrow A违反:

    • XRX\subset R
    • ARA\in R为单独属性
    • AXA\notin X,不是平凡依赖

    对R进行XA和R-A的分解

    反复执行

    多值依赖

    XYX\rightarrow \rightarrow Y

    Z=RXYZ=R-XY,X相同的情况下,Y和Z的全组合都出现

    函数依赖是特例:X取一个值的时候,Y有唯一的值,Y和Z的组合全出现

    R满足4NF,若对每一个R上的XYX\rightarrow \rightarrow Y下面条件有一个成立:

    • YXY\subseteq X
    • XY=RXY = R
    • X为一个超键

    若R为BCNF,且存在一个单属性的候选键,则R为4NF

    连接依赖

    无损连接分解为连接了依赖

    5NF:所有Ri=RRi=R或连接依赖为一组函数依赖所蕴含,函数依赖左侧都是候选键

    R为3NF且每个候选键都是单属性,则也为5NF

    数据存储于访问路径

    索引:给定一个键,找到对应的值

    树结构索引

    B+树:每个节点可以有多个孩子,且永远是平衡的,每个节点是一个page,所有key存储在叶子节点,内部节点完全是索引作用

    所有叶子逻辑上组成一个数组,叶节点从左至右从小大大排序,使用sibling pointer连起来

    查找直接二分,代价:

    • 总共N个key
    • 每个节点child/pointer个数为B
    • 树高O(logBN)O(\log_{B}N)
    • 总比较次数
      • 每个节点内部二分查找:$O(\log_{2}B)
      • O(logBN)×O(log2B)=O(log2N)O(\log_{B}N) \times O(\log_{2}B) = O(\log_{2}N)
    • 总I/O次数 = O(logBN)O(\log_{B}N)s

    Insertion

    Search而后在节点插入:

    • 叶节点未满,插入叶节点
    • 叶节点满了,节点分裂
      • 分裂算法:
      • 原始节点叶子数量为l
      • 原始节点更新后有(l+1)/2\lceil (l+1)/2\rceil
      • 新节点有(l+1)/2\lfloor (l+1)/2\rfloor
      • 将第(l+1)/2\lceil (l+1)/2\rceil键移动到父节点,将新节点插入父节点
      • 重复知道无需拆分

    Deletion

    节点为空进行merger,或者完全不merge

    哈希索引

    Extendible Hash

    采用前n位作为hash键,若对应的表项满,则采用更多的位数作为键,区分度更高

    其他索引

    ISAM:排序文件+多层索引

    类似B+树在计算机数据文件上的应用,但插入操作与B+树不同,上面索引不变,而是在数据部分增加溢出页

    位图索引

    横排:相同key具有多个记录

    • 可在树结构或哈希表key对应的位置放不同的项,或在树结构、哈希表中允许多项具有相同的key
    • 通过指针指向其余区域的间接层,间接层中存放记录
    • 位图索引,简介层记录位图,key对应bitmap,bitmap每位对应一条记录,01表示取值相同与否

    当1个数少时压缩位图,使用距离表示1间隔

    倒排索引

    每条文本进行标号,每个单词记录含有此单词的文本序号

    多维索引

    单维索引不同维度的重要性是不同的,多维索引相似

    Z-order:多维数据放入一维

    网格文件

    • 空间切成一个个长方形网格
    • 每个网格对应一个桶,存储在数据页中
    • 用数据结构记录桶的位置

    桶矩阵:横坐标是横向划分的数据区间,纵坐标是纵向划分的数据区间

    部分匹配,范围查询,最近邻查询

    插入时划分网格,要使改变前后网格中数据分布都很均匀

    分段散列

    对每一维属性key进行哈希值计算,最终hash值为它们的拼接

    无法有效支持不等值比较

    二维上还有

    四叉树

    R-Tree

    每个树节点代表一个区域:MBR,是包含子树中所有对象的最小外接矩形,可能有重叠区域,希望最小

    插入:

    • 对每个内部节点插入时考虑
      • 选择MBR面积增大最小的孩子
      • 当面积增加相同时考虑面积最小的
      • 进入孩子节点,重复

    有空位插入,否则split

    查询处理

    系统目录

    存储数据的元信息:

      • 表名
      • 表存储方式
      • 属性名、类名
      • 索引名
      • 完整性约束
      • 统计信息
        • 记录数
        • 表大小:页数
        • 属性值分布特征
    • 索引

      • 名称
      • 结构类型
      • key组成属性
      • 统计信息
        • key个数
        • 索引大小:页数
        • 树结构索引高度
        • 索引范围
    • 视图

      • 名称
      • 定义

    查询计划:Query Optimizer产生,Execution Engine按照plan执行,最终表现为一颗Operator Tree

    每个节点代表一个运算,运算的输入来自孩子节点,输出送往父节点

    处理方式

    operator at a time

    完整执行每个operator

    每个operator一个函数

    中间结果表的代价大

    tuple at a time

    每个operator设计成为具有统一的函数接口: open, getnext, close

    主程序循环调用根的getnext,执行方式是从上至下的pull方式,父节点调用子节点getnext生成一条条结果

    两类operator:

    • non-blocking
    • blocking: 需要预处理一遍数据

    缺点是代码执行路径很长

    getnext返回组记录,循环集中处理

    多线程流水线

    push方式,operator tree划分为多个子树,每个线程负责一个子树,线程之间传递中间结果

    一个线程等待孩子节点的结果来到后进行计算,产生结果,发送给父亲节点,push

    选择

    无索引、未排序

    顺序访问每个页和记录

    IO代价MRM_{R},即数据页数量

    无索引、排序

    二分查找

    MRM_{R}数据页数量,满足条件的记录占据D个数据页

    总代价:log2MR+D\log_{2}M_{R} + D

    $B+ Tree

    • 聚簇索引:叶子节点就是数据页。对表首先利用主键组织到一颗B+树中,而后将辅助索引键组织到B+树。使用辅助键索引需要2次B+树查找

    • 非聚簇索引:叶子节点存RecordID,随机读取,辅助键和主键直接索引到数据中

    假设B+ Tree的查找代价为H次IO,符合条件索引项有m个叶子节点页,指向m个记录

    总代价:H+L+m

    哈希索引

    哈希表的平均查找代价为H次IO,符合条件的记录有m个

    总代价:H+m

    多个选择条件

    • 文件扫描是最通用的方法,对每个记录求解任意复杂的选择条件
    • 先求解一个合取条件,转换为合取范式
    • 使用位图索引,获得每个选择条件的位图,而后计算总位图,按位操作
    • 利用多个索引,获取每个字条件RecordID集合,对集合操作

    投影

    • 行式数据库,在选择的基础上,对选中的记录提取指定的列
    • 列式数据库,不同的列存放在不同的文件,投影即为选择不同的文件,需要把同一记录的多个列从多个文件中读取组装

    排序

    内存排序

    • O(n2)O(n^{2})

    冒泡,选择,插入

    • O(nlogN)O(n\log N)

    快排,归并,堆

    • O(n)O(n)

    基数

    外存排序

    归并