数据库新技术【分布式数据库】

文章目录

  • 第一章 概述
    • 1.1 基本概念
      • 1.1.1 分布式数据库
      • 1.1.2 数据管理的透明性
      • 1.1.3 可靠性
      • 1.1.4 分布式数据库与集中式数据库的区别
    • 1.2 体系结构
    • 1.3 全局目录
    • 1.4 关系代数
      • 1.4.1 基操
      • 1.4.2 关系表达式
      • 1.4.3 查询树
  • 第二章 分布式数据库的设计
    • 2.1 设计策略
    • 2.2 分布设计的目标
    • 2.3 水平分片设计
      • 2.3.1 需求分析
      • 2.3.2 简单谓词集合的精炼处理
      • 2.3.3 最小谓词集合处理
      • 2.3.4 诱导分片
      • 2.3.5 正确性检查
    • 2.4 垂直分片设计
      • 2.4.1 使用矩阵
      • 2.4.2 亲密矩阵
      • 2.4.3 聚集的属性亲密矩阵(理解即可,有点复杂)
      • 2.4.5 正确性检查
    • 2.5 分解树和重构树
    • 2.6 分配
  • 第三章 分布式查询
    • 3.1 查询分解
      • 3.1.1 规范化
      • 3.1.2 规范化规则
      • 3.1.3 逻辑规则
      • 3.1.4 冗余消除
      • 3.1.5 查询树优化
    • 3.2 数据定位
      • 3.2.1 合并重构树
      • 3.2.2 水平分片的裁剪
      • 3.2.3 垂直分片的裁剪
      • 3.2.4 诱导分片的裁剪
      • 3.2.5 混合分片的裁剪
    • 3.3 全局优化
      • 3.3.1 目标
      • 3.3.2 代价的估算
      • 3.3.3 主要优化问题
      • 3.3.4 主要算法
    • 3.4 局部优化
  • 第四章 分布式并发控制
    • 4.1 串行化理论
      • 4.1.1 集中式可串行化
      • 4.1.2 分布式可串行化
    • 4.2 并发控制概况
    • 4.3 基于锁的并发控制
      • 4.3.1 基本概念
      • 4.3.2 两段锁协议(2PL)
        • 4.3.2.1 集中式数据库中2PL的可串行性
        • 4.3.2.2 分布式数据库中2PL的可串行性
    • 4.4 死锁问题
  • 第五章 分布式恢复
  • 第六章 区块链技术
  • 第七章 NewSQL数据库
  • 第八章 NoSQL数据库
  • 第九章 课程设计
    • 9.1 需求
    • 9.2 设计
      • 9.2.1 表及其结构(类图)
      • 9.2.2 表间的关联(ER图)
      • 9.2.3 表的分布设计
      • 9.2.4 \<key, value\>存储及其与表之间的联系(索引)
      • 9.2.5 关键事务的描述
      • 9.2.6 主要的查询流程

第一章 概述

1.1 基本概念

1.1.1 分布式数据库

  分布式数据库——多个分布在计算机网络上的逻辑相关的数据库的集合。

  分布式数据库中,存放在不同网络节点上的数据库称作局部数据库,由局部数据库构成的逻辑整体称为全局数据库。全局数据库中的关系称为全局关系,局部数据库中的关系称为逻辑片段,或简称片段。

  全局关系与片段之间的映射关系称为分片。全局数据库与局部数据库之间的映射关系由一组分片模式来体现。一个逻辑片段可以保存在网络的一个节点上,也可以在网络的多个节点上保存多个副本,逻辑片段如何在网络上存放,称为分配

1.1.2 数据管理的透明性

  • 分片透明:用户使用数据库时,不需要知道全局数据库与多个局部数据库之间的逻辑关系。
  • 复制(分配)透明:用户使用数据库时,不需要知道数据在网络上不同节点间的复制情况。
  • 网络透明:用户使用数据库时,用全局唯一的对象名指代所要操作的对象,不需知道数据在网络上的位置。
  • 数据独立性(无分布透明):用户应用不受数据库逻辑结构变化的影响,用户应用不需关注数据库数据保存的物理结构。集中式数据库就具有这样的特性。

1.1.3 可靠性

  事务是数据库上的一致的可靠的计算单元,事务由一串具有原子性的数据库操作组成。

  事务具有ACID四个特性。

  • 原子性(Atomicity),组成一个事务的一串操作要么全部完成,要么全部没做。
  • 一致性(Consistency),并发执行的事务总是使得数据库从一个一致的状态转变为另一个一致的状态。
  • 隔离性(lsolation),一个事务执行过程中无法看到其他并发事务的中间结果。
  • 持久性(Durability),已完成事务的结果将会被可靠地永久地保存,直至被另一个事务所更新。

  事务的性质在分布式数据库中必须得到保证。在分布式环境中保障事务性质显然与集中式环境有很多不同。集中式数据库环境中若服务器节点失效,数据库系统将无法运转,而在分布式数据库环境中,在某些条件满足时,即使某个服务器节点失效,数据库系统仍能运转。

1.1.4 分布式数据库与集中式数据库的区别

  集中式数据库中数据库存放在网络上的一个节点上,而分布式数据库数据库分布存放在网络上不同节点上。

1.2 体系结构

  1. 客户机/服务器模式:多客户机/单服务器、多客户机/多服务器
  2. 对等节点模式:
  3. 多数据库模式:含全局概念模式、不含全局概念模式。

1.3 全局目录

  全局目录是分布式数据库中描述全局数据库与局部数据库关系的信息集合(分片模式和分配模式的集合)。只有分布式数据库有全局目录的问题。在分布式数据库中全局目录是目录的一部分。

  目录本身也是一个数据库。目录可以集中存放在一个节点上,也可以分为全局目录和局部目录,分布存放在网络的不同节点上。

  分布式数据库的设计技术同样适用于目录。分布式环境中,一个目录可以只在一个节点上存放一个拷贝,也可以在多个节点上存放多个拷贝。

1.4 关系代数

1.4.1 基操

在这里插入图片描述

1.4.2 关系表达式

  由关系代数运算经有限次复合而成的式子称为关系代数表达式。这种表达式的运算结果仍然是一个关系。可以用关系代数表达式表示对数据库的查询和更新操作。

例如:
数据库中有三个关系如下:
学生关系 Stu1(sid, sname, sage, sgender),Stu2(sid, sname, sage, sgender)
选课关系 SC(sid, cid, grade)
课程关系 Cou(cid, cname, cteacher)

  1. 查询学号为112的学生年龄
    π s a g e ( σ s i d = ′ 11 2 ′ ( S t u 1 ) ) \pi_{sage}(\sigma_{sid='112'}(Stu1)) πsage(σsid=112(Stu1))
  2. 查询学号为112或者212的学生性别
    π s g e n d e r ( σ s i d = ′ 11 2 ′ ∨ s i d = ′ 21 2 ′ ( S t u 1 ∪ S t u 2 ) ) \pi_{sgender}(\sigma_{sid='112' \vee sid='212'}(Stu1\cup Stu2)) πsgender(σsid=112sid=212(Stu1Stu2))
  3. 查询同时出现在两个学生关系中的学生学号和姓名
    π s i d , s n a m e ( S t u 1 ∩ S t u 2 ) \pi_{sid, sname}(Stu1\cap Stu2) πsid,sname(Stu1Stu2)
  4. 查询出现在学生关系1且不在学生关系2中的学生学号和姓名
    π s i d , s n a m e ( S t u 1 − S t u 2 ) \pi_{sid, sname}(Stu1-Stu2) πsid,sname(Stu1Stu2)
  5. 查询学号为112的学生的数据库课程成绩
    π g r a d e ( σ s i d = ′ 11 2 ′ ∧ c n a m e = ′ 数据 库 ′ ( C o u ⋈ C o u . c i d = S C . c i d S C ) ) \pi_{grade}(\sigma_{sid='112'\wedge cname='数据库' }(Cou\Join_{Cou.cid=SC.cid} SC)) πgrade(σsid=112cname=数据(CouCou.cid=SC.cidSC))
  6. 查询学生关系1中选过课的学生学号和姓名
    π s i d , s n a m e ( S t u 1 ⋉ S t u 1. s i d = S C . s i d S C ) \pi_{sid, sname}(Stu1\ltimes_{Stu1.sid=SC.sid} SC) πsid,sname(Stu1Stu1.sid=SC.sidSC)
    【注:半连接返回左表中与右表至少匹配一次的数据行,通常体现为 EXISTS 或者 IN 子查询】

1.4.3 查询树

  关系表达式可进一步转换为查询树,查询树包含关系操作的先后顺序,数据库系统可依据查询树控制查询操作。

例如:

  1. 查询学号为112的学生年龄
    π s a g e ( σ s i d = ′ 11 2 ′ ( S t u 1 ) ) \pi_{sage}(\sigma_{sid='112'}(Stu1)) πsage(σsid=112(Stu1))请添加图片描述

  2. 查询学号为112或者212的学生性别
    π s g e n d e r ( σ s i d = ′ 11 2 ′ ∨ s i d = ′ 21 2 ′ ( S t u 1 ∪ S t u 2 ) ) \pi_{sgender}(\sigma_{sid='112' \vee sid='212'}(Stu1\cup Stu2)) πsgender(σsid=112sid=212(Stu1Stu2))请添加图片描述

  3. 查询同时出现在两个学生关系中的学生学号和姓名
    π s i d , s n a m e ( S t u 1 ∩ S t u 2 ) \pi_{sid, sname}(Stu1\cap Stu2) πsid,sname(Stu1Stu2)请添加图片描述

  4. 查询出现在学生关系1且不在学生关系2中的学生学号和姓名
    π s i d , s n a m e ( S t u 1 − S t u 2 ) \pi_{sid, sname}(Stu1-Stu2) πsid,sname(Stu1Stu2)请添加图片描述

  5. 查询学号为112的学生的数据库课程成绩
    π g r a d e ( σ s i d = ′ 11 2 ′ ∧ c n a m e = ′ 数据 库 ′ ( C o u ⋈ C o u . c i d = S C . c i d S C ) ) \pi_{grade}(\sigma_{sid='112'\wedge cname='数据库' }(Cou\Join_{Cou.cid=SC.cid} SC)) πgrade(σsid=112cname=数据(CouCou.cid=SC.cidSC))请添加图片描述

  6. 查询学生关系1中选过课的学生学号和姓名
    π s i d , s n a m e ( S t u 1 ⋉ S t u 1. s i d = S C . s i d S C ) \pi_{sid, sname}(Stu1\ltimes_{Stu1.sid=SC.sid} SC) πsid,sname(Stu1Stu1.sid=SC.sidSC)请添加图片描述

第二章 分布式数据库的设计

2.1 设计策略

  当数据库的设计是从头开始时,自顶向下的设计是合适的。然而有时一些数据库已经存在,设计是为了集成已存在的一些数据库,这时需要自底向上的设计方法。

  自底向上的设计方法所涉及的需要集成的多个数据库常常是异构的。

2.2 分布设计的目标

  1. 分布设计的多个子目标之间相互矛盾,只能进行平衡折中的处理。
  2. 分布设计应使每个应用访问的局部数据库尽可能少。
  3. 分布设计应尽可能提高应用的并发程度。
  4. 分布设计应尽可能减少应用执行过程中的网络通信量。
  5. 分布设计应尽可能让用户应用在网络上就近访问。

2.3 水平分片设计

2.3.1 需求分析

  • 收集用户查询所用的谓词。
  • 用户查询无穷无尽,无法全部收集,通常在80/20规则的指导下进行。即:20%的最活跃的查询可以反映80%的数据访问情况。

在这里插入图片描述

2.3.2 简单谓词集合的精炼处理

谓词: P i : A i    θ    V a l u e        θ ∈ { = , < , > , ≠ , ≤ , ≥ } P_i: A_i \;\theta\; Value\;\;\; \theta \in \{=,<,>,\not=,\le,\ge\} Pi:AiθValueθ{=,<,>,=,,}
例如: P 1 : L O C    =    " M o n t r e a l " P_1:LOC\; = \; "Montreal" P1:LOC="Montreal"

P r i = { p i 1 , P i 2 , . . . , p i m } P_{ri} = \{p_{i1}, P_{i2},. . ., p_{im}\} Pri={pi1,Pi2,...,pim} 是针对关系 r i r_i ri 收集的简单谓词集合。
P r i P_{ri} Pri 经算法COM-MIN处理后得到 P r i ′ P'_{ri} Pri。对于关系 r i r_i ri P r i ′ P'_{ri} Pri 是满足分布设计要求的最小简单谓词集合。

例如,针对关系PROJ得到了 P ′ = { p 1 , P 2 , P 3 , P 4 , P 5 } P'= \{p1, P2, P3, P4, P5\} P={p1,P2,P3,P4,P5}
p1:LOC = “Montreal”
p2:LOC = “New York”
p3:LOC = "Paris’
p4:DUDGET ≤200000
p5:DUDGET > 200000

2.3.3 最小谓词集合处理

M i = { m i j ∣ m j j = ∧ p i k ∗ ,    1 < j < z ,    p i k ∗ = p i k ∣ ¬ p i k ,    p i k ∈ P r i ′ } M_i = \{m_{ij}|m_{jj} = \wedge p^*_{ik}, \; 1<j<z, \;p^*_{ik}=p_{ik}|\neg p_{ik},\; p_{ik}∈P'_{ri} \} Mi={mijmjj=pik,1<j<z,pik=pik∣¬pik,pikPri}   M i M_i Mi是关于关系 r i r_i ri最小项谓词集合从 P r i ′ P'_{ri} Pri中得到,是进行水平分片的依据。

例如,由 P ′ = { p 1 , p 2 , p 3 , p 4 , p 5 } 可得 M = { m j }    ( 1 ≤ j ≤ 2 5 ) P'=\{p_1,p_2,p_3, p_4, p_5\}可得M=\{m_j\}\;(1≤j≤2^5) P={p1,p2,p3,p4,p5}可得M={mj}(1j25)。然而,谓词间隐含着一些语意。

i 1 :    p 1 ⇒ ¬ p 2 ∧ ¬ p 3 i_1:\; p1\Rightarrow \neg p2 \wedge \neg p_3 i1:p1¬p2¬p3
i 2 :    p 2 ⇒ ¬ p 1 ∧ ¬ p 3 i_2:\; p2\Rightarrow \neg p1 \wedge \neg p_3 i2:p2¬p1¬p3
i 3 :    p 3 ⇒ ¬ p 1 ∧ ¬ p 2 i_3:\; p3\Rightarrow \neg p1 \wedge \neg p_2 i3:p3¬p1¬p2
i 4 :    p 4 ⇒ ¬ p 5 i_4:\; p4\Rightarrow \neg p5 i4:p4¬p5
i 5 :    p 5 ⇒ ¬ p 4 i_5:\; p5\Rightarrow \neg p4 i5:p5¬p4
i 6 :    ¬ p 4 ⇒ p 5 i_6:\; \neg p4\Rightarrow p5 i6:¬p4p5
i 7 :    ¬ p 5 ⇒ p 4 i_7:\; \neg p5\Rightarrow p4 i7:¬p5p4

i 1 − 7 i_{1-7} i17可知, p 1 − 3 p_{1-3} p13不可能同时存在, p 4 − 5 p_{4-5} p45不可能同时存在,删除非法和重复的最小谓词项后,得到 M = { m i , 1 ≤ i ≤ 6 } M=\{m_i, 1 \le i \le 6\} M={mi,1i6}

在这里插入图片描述

最后根据最小谓词集合M进行水平分片:

在这里插入图片描述
分片结果如下:
在这里插入图片描述

  其中 P R O J 2 , P R O J 5 PROJ_2, PROJ_5 PROJ2,PROJ5为空,那是由PROJ的当前值决定的,数据库是动态的,PROJ的值也是动态的。

2.3.4 诱导分片

在这里插入图片描述
  水平分片可以直接对一个关系搜集应用信息,设计分片,也可以从另一个关系诱导其分片方案。如图所示,关系间存在着link ,如L1,L2,L3。用关系代数的术语来讲,link表示一个关系的外键是另一个关系的主键。例如,L3表示ASG的外键JNO是PROJ的主键。

对于owner关系直接设计其水平分片,对于member关系从owner关系诱导出水平分片的设计。诱导分片的设计方法是半连接。例如,关于ASG的水平分片可如下设计:

在这里插入图片描述
  有的member有多个owner,例如,EMP和PROJ都是ASG的owner。这种情况下,从不同的owner诱导出不同的水平分片方案。最终由设计者根据系统分配的需求选取一种。

2.3.5 正确性检查

  • 完整性:全局关系的任何数据至少可在一个分片中找到,并且每个分片被访问的概率相同。
  • 重构性 R = ∪ R i , ∀ R i ∈ F R 。 R=\cup R_i,\forall R_i ∈ F_R。 R=RiRiFR
  • 不相交性 R i ∩ R j = ∅ , ∀ i , j    R i , R j ∈ F R 。 R_i∩R_j=\empty ,\forall i,j\; R_i, R_j ∈ F_R。 RiRj=i,jRi,RjFR

2.4 垂直分片设计

  在分布式数据库中可采用垂直分片分割全局关系,在集中式数据库中也可采用垂直分片设计存储结构,把经常一起被访问的列聚集存放在一起,提高存储效率。
  垂直分片可选方案非常多。m个非主键属性可能的垂直分片方案的数量是B(m),当m = 10时,B(m) ≈ 115000,当m = 15时,B(m) ≈ 1 0 9 10^9 109,当m = 30时,B(m) ≈ 1 0 23 10^{23} 1023。因此,垂直分片的设计是非常困难的。
  两种启发式的途径:成组和切分。

2.4.1 使用矩阵

在这里插入图片描述
在这里插入图片描述
A 1 = P N O , A 2 = P N A M E , A 3 = B U D G E T , A 4 = L O C A_1=PNO, A_2=PNAME, A_3=BUDGET, A4=LOC A1=PNO,A2=PNAME,A3=BUDGET,A4=LOC

u s e ( q i , A j ) = ( 1 0 1 0 0 1 1 0 0 1 0 1 0 0 1 1 ) use(q_i,A_j)= \begin{pmatrix} 1 & 0 & 1 & 0 \\ 0 & 1 & 1 & 0 \\ 0 & 1 & 0 & 1 \\ 0 & 0 & 1 & 1 \end{pmatrix} use(qi,Aj)= 1000011011010011

2.4.2 亲密矩阵

  使用矩阵没有包含应用调用查询的频率信息,不能足够反应出属性之间的亲密程度。为此,进一步给出属性间的亲密度定义:

在这里插入图片描述

其中, a c c l ( q k ) acc_l(q_k) accl(qk)是应用 I 调用查询 q k q_k qk的频率。

在这里插入图片描述
计算方法:

  1. 先计算 a c c ( q k ) = ∑ l = 1 3 a c c l ( q k ) acc(q_k)=\sum^3_{l=1} acc_l(q_k) acc(qk)=l=13accl(qk)
    a c c ( q 1 ) = 15 + 20 + 10 = 45 acc(q_1)=15+20+10=45 acc(q1)=15+20+10=45
    a c c ( q 2 ) = 5 + 0 + 0 = 5 acc(q_2)=5+0+0=5 acc(q2)=5+0+0=5
    a c c ( q 3 ) = 25 + 25 + 25 = 75 acc(q_3)=25+25+25=75 acc(q3)=25+25+25=75
    a c c ( q 4 ) = 3 + 0 + 0 = 3 acc(q_4)=3+0+0=3 acc(q4)=3+0+0=3
  2. 再计算亲密矩阵的上三角元素 a i j = ∑ k = 1 4 a c c ( q k ) ∗ ( u s e ( q k , A i ) ∧ u s e ( q k , A j ) ) a_{ij}=\sum_{k=1}^4 acc(q_k)*(use(q_k,A_i)\wedge use(q_k,A_j)) aij=k=14acc(qk)(use(qk,Ai)use(qk,Aj)),其中 u s e ( q k , A i ) ∧ u s e ( q k , A j ) use(q_k,A_i)\wedge use(q_k,A_j) use(qk,Ai)use(qk,Aj)的值为使用矩阵 use 对应元素“与”的结果。
    a 11 = 45 ∗ ( 1 ∧ 1 ) + 5 ∗ ( 0 ∧ 0 ) + 75 ∗ ( 0 ∧ 0 ) + 3 ∗ ( 0 ∧ 0 ) = 45 a_{11}=45*(1\wedge 1)+5*(0\wedge 0)+75*(0\wedge 0)+3*(0\wedge 0)=45 a11=45(11)+5(00)+75(00)+3(00)=45
    a 12 = 45 ∗ ( 1 ∧ 0 ) + 5 ∗ ( 0 ∧ 1 ) + 75 ∗ ( 0 ∧ 1 ) + 3 ∗ ( 0 ∧ 0 ) = 0 a_{12}=45*(1\wedge 0)+5*(0\wedge 1)+75*(0\wedge 1)+3*(0\wedge 0)=0 a12=45(10)+5(01)+75(01)+3(00)=0
    a 13 = 45 ∗ ( 1 ∧ 1 ) + 5 ∗ ( 0 ∧ 1 ) + 75 ∗ ( 0 ∧ 0 ) + 3 ∗ ( 0 ∧ 1 ) = 45 a_{13}=45*(1\wedge 1)+5*(0\wedge 1)+75*(0\wedge 0)+3*(0\wedge 1)=45 a13=45(11)+5(01)+75(00)+3(01)=45
    a 14 = 45 ∗ ( 1 ∧ 0 ) + 5 ∗ ( 0 ∧ 0 ) + 75 ∗ ( 0 ∧ 1 ) + 3 ∗ ( 0 ∧ 1 ) = 45 a_{14}=45*(1\wedge 0)+5*(0\wedge 0)+75*(0\wedge 1)+3*(0\wedge 1)=45 a14=45(10)+5(00)+75(01)+3(01)=45
    a 22 = 45 ∗ ( 0 ∧ 0 ) + 5 ∗ ( 1 ∧ 1 ) + 75 ∗ ( 1 ∧ 1 ) + 3 ∗ ( 0 ∧ 0 ) = 80 a_{22}=45*(0\wedge 0)+5*(1\wedge 1)+75*(1\wedge 1)+3*(0\wedge 0)=80 a22=45(00)+5(11)+75(11)+3(00)=80
    a 23 = 45 ∗ ( 0 ∧ 1 ) + 5 ∗ ( 1 ∧ 1 ) + 75 ∗ ( 1 ∧ 0 ) + 3 ∗ ( 0 ∧ 1 ) = 5 a_{23}=45*(0\wedge 1)+5*(1\wedge 1)+75*(1\wedge 0)+3*(0\wedge 1)=5 a23=45(01)+5(11)+75(10)+3(01)=5
    a 24 = 45 ∗ ( 0 ∧ 0 ) + 5 ∗ ( 1 ∧ 0 ) + 75 ∗ ( 1 ∧ 1 ) + 3 ∗ ( 0 ∧ 1 ) = 75 a_{24}=45*(0\wedge 0)+5*(1\wedge 0)+75*(1\wedge 1)+3*(0\wedge 1)=75 a24=45(00)+5(10)+75(11)+3(01)=75
    a 33 = 45 ∗ ( 1 ∧ 1 ) + 5 ∗ ( 1 ∧ 1 ) + 75 ∗ ( 0 ∧ 0 ) + 3 ∗ ( 1 ∧ 1 ) = 53 a_{33}=45*(1\wedge 1)+5*(1\wedge 1)+75*(0\wedge 0)+3*(1\wedge 1)=53 a33=45(11)+5(11)+75(00)+3(11)=53
    a 34 = 45 ∗ ( 1 ∧ 0 ) + 5 ∗ ( 1 ∧ 0 ) + 75 ∗ ( 0 ∧ 1 ) + 3 ∗ ( 1 ∧ 1 ) = 3 a_{34}=45*(1\wedge 0)+5*(1\wedge 0)+75*(0\wedge 1)+3*(1\wedge 1)=3 a34=45(10)+5(10)+75(01)+3(11)=3
    a 44 = 45 ∗ ( 0 ∧ 0 ) + 5 ∗ ( 0 ∧ 0 ) + 75 ∗ ( 1 ∧ 1 ) + 3 ∗ ( 1 ∧ 1 ) = 78 a_{44}=45*(0\wedge 0)+5*(0\wedge 0)+75*(1\wedge 1)+3*(1\wedge 1)=78 a44=45(00)+5(00)+75(11)+3(11)=78
  3. 亲密矩阵 aff 为对称矩阵,根据对称性补完剩下的下三角元素
    在这里插入图片描述

2.4.3 聚集的属性亲密矩阵(理解即可,有点复杂)

  属性亲密度矩阵显然让垂直分片设计工作前进了一步。但是仍然无法直接给出垂直分片方案。如果亲密的属性聚集在一起,设计垂直分片将会比较容易。聚集的属性亲密度矩阵就是亲密属性聚集在一起的属性亲密度矩阵。聚集的属性亲密度矩阵是由属性亲密度矩阵经过行间交换以及对应的列间交换得到的。为通过算法得到这样的矩阵,定义全局亲密度度量:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

具体例子:

在这里插入图片描述

确定分割点
在这里插入图片描述
在这里插入图片描述

  对于n个属性,在CA中有n-1个分割点。每个分割点可以计算一个z值,选取z值最大的那个分割点对属性集合进行划分。这样的划分可迭代进行下去,直到给定的条件满足为止。
  假设AS1,AS2,.…. ,ASx是通过上述方法对一个关系进行属性集划分得到的k个属性子集。然后,对这些属性集进行如下处理:
在这里插入图片描述

2.4.5 正确性检查

在这里插入图片描述

2.5 分解树和重构树

  水平分片和垂直分片可以混合使用,如图所示:

在这里插入图片描述
  上图的树被称作分解树,描述了全局关系与逻辑片段之间的关系。全局关系可由逻辑片段通过重构树(下图所示)的操作序列重构出来。

在这里插入图片描述

2.6 分配

每个逻辑片段可以保存在一个节点上,也可以在多个节点上保存多个副本。保存多个副本有利于提高查询的效率,但是却会增加更新的代价。分配是一个非常复杂的优化问题。可简单表述如下:

在这里插入图片描述

第三章 分布式查询

3.1 查询分解

3.1.1 规范化

  查询条件可由谓词表达式表示,将查询的谓词表达式进行规范化处理有助于删除冗余操作。规范化形式有合取规范化析取规范化

  1. 合取规范化【 ( a + b ) ∗ ( b + c ) ∗ ( c + d ) ∗ . . . (a+b)*(b+c)*(c+d)*... (a+b)(b+c)(c+d)...
    在这里插入图片描述
  2. 析取规范化【 a b + b c + c d + . . . ab+bc+cd+... ab+bc+cd+...
    在这里插入图片描述

3.1.2 规范化规则

在这里插入图片描述

3.1.3 逻辑规则

在这里插入图片描述

3.1.4 冗余消除

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.1.5 查询树优化

  查询经前述处理后被写成一颗查询树,为减少计算量,需对查询树进行优化处理,优化处理所依据的规则如下。R,S,T表示不同的关
系,A= {A1,A2,……. ,An} 和 B={B1,B2,… ,Bn} 分别表示R, S的属性集。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  下页左图是一颗查询树,查询树优化的目标就是从等价的查询树中找出代价最小的那一颗。但是等价的查询树数量太多,无法比较所有的查询树代价。可行的办法就是采用启发式的方法寻找较优的查询树。一个启发式途径是:采用下移一元操作的方式优化查询树。

在这里插入图片描述

3.2 数据定位

3.2.1 合并重构树

  优化后的查询树的叶节点是全局关系,在分布式数据库中全局关系是虚拟的,如果操作没有定位到逻辑片段,查询是无法进行的。将查询操作落实到具体的逻辑片段上,这一工作称为数据定位。数据定位最简单的做法是:用全局关系的重构树代替查询树中的全局关系,把重构树合并到查询树中来。
  但是,合并重构树是不够的。因为,对于一个具体的查询有的逻辑片段是不可能有结果,针对这样的逻辑片段进行计算完全是浪费。这里把查询树中不可能有结果的逻辑片段称为无用节点,删除无用节点是需要开展的下一步优化工作。

3.2.2 水平分片的裁剪

在这里插入图片描述
在这里插入图片描述

例如:
  EMP(ENO, ENAME, TITLE) 和 ASG 被如下分片:

在这里插入图片描述
在这里插入图片描述

对于查询1:
在这里插入图片描述
  该查询经初步优化和合并重构树后得到左图所示的查询树,根据规则1裁剪无用节点,得到右图所示的查询树。显然,右图的查询树与左图的查询树相比,可以省掉很多计算,却能够得到同样的结果。
在这里插入图片描述

对于查询2:
S E L E T E    ∗ F R O M    E M P , A S G W H E R E    E M P . E N O = A S G . E N O \begin{align} & SELETE\; * \\ & FROM \; EMP,ASG \\ & WHERE \; EMP.ENO=ASG.ENO \end{align} SELETEFROMEMPASGWHEREEMP.ENO=ASG.ENO
在这里插入图片描述
上图的查询树可经过并与连接转换,规则2的转换,变换为下图的查询树。下图的查询树计算量远低于上图。

在这里插入图片描述

3.2.3 垂直分片的裁剪

在这里插入图片描述
对于查询:
在这里插入图片描述
该查询经初步优化和合并重构树后得到下图所示的查询树。

在这里插入图片描述

上图的查询树经一元操作幂等律、投影与连接的交换、垂直分片的裁剪转换为下图的查询树。

在这里插入图片描述

3.2.4 诱导分片的裁剪

在这里插入图片描述
对于查询:
在这里插入图片描述
查询树如下:
在这里插入图片描述
优化【删除空选择】
在这里插入图片描述
优化【交换连接与并】
在这里插入图片描述
优化【根据诱导分片,删除空子树】
在这里插入图片描述

3.2.5 混合分片的裁剪

在这里插入图片描述
查询树为:

在这里插入图片描述
优化后

在这里插入图片描述

3.3 全局优化

3.3.1 目标

  • 在查询操作落实到逻辑片段并裁剪了无用节点之后,查询还需要进一步优化。进一步优化需要考虑执行操作的位置,执行操作的顺序,执行操作的代价等问题。
  • 目标是:寻找一个代价最小且与原查询树等价的查询树。
  • 代价包括数据通信量、CPU时间、I/O时间等。

这仍然是一个NP困难问题,只能采用启发式方法寻求较优的方案。

3.3.2 代价的估算

  查询的代价可以是查询所消耗的总时间,也可以是查询的响应时间。总时间指执行查询的各个操作所消耗的时间总和,响应时间指查询开始到查询完成所经历的时间。

  无论是总时间还是响应时间,都需通过数据库的统计数据来估算。

常用的统计量

  关系R的属性集为 A = { A 1 , A 2 , … , A n } A= \{A_1,A_2,…,A_n\} A={A1,A2,,An},被分片为 R 1 , R 2 , … , R n R_1,R_2,…,R_n R1,R2,,Rn

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.3.3 主要优化问题

  前面的优化处理已经把操作落实到了逻辑片段上并尽可能下推了一元运算,这时的主要问题是选择连接运算的场地和运算次序。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

半连接处理

在这里插入图片描述

3.3.4 主要算法

  1. Distributed INGRES Algorithm
  2. R* Algorithm
  3. SDD-1 Algorithm

3.4 局部优化

  对那些已经定位到一个场地上的一系列操作采用集中式数据库中的优化方法继续进行局部优化。

  局部优化有动态优化静态优化两种策略,大多数商业关系型数据库系统采用静态优化的策略。

第四章 分布式并发控制

4.1 串行化理论

  • 并发控制关系到事务的隔离性一致性
  • 串行化理论是被广泛接受的判断并发控制正确性的标准。

例如,有以下事务及其之上的调度:

T 1 = { R 1 ( x ) , W 1 ( x ) , G 1 } T_1=\{R_1(x), W_1(x),G_1\} T1={R1(x),W1(x),G1}
T 2 = { W 2 ( x ) , W 2 ( y ) , R 2 ( z ) , C 2 } T2= \{W_2(x),W_2(y), R_2(z),C_2\} T2={W2(x),W2(y),R2(z),C2}
T 3 = { R 3 ( x ) , R 3 ( y ) , R 3 ( z ) , C 3 } T3=\{R_3(x),R_3(y),R_3(z),C_3\} T3={R3(x)R3(y),R3(z),C3}
S = { W 2 ( x ) , W 2 ( y ) , R 2 ( z ) , C 2 , R 1 ( x ) , W 1 ( x ) , C 1 , R 3 ( x ) , R 3 ( y ) , R 3 ( z ) , C 3 } S=\{W_2(x), W_2(y),R_2(z),C_2,R_1(x), W_1(x),C_1, R_3(x), R_3(y),R_3(z),C_3\} S={W2(x),W2(y),R2(z),C2,R1(x),W1(x),C1,R3(x),R3(y),R3(z),C3}

  S是对事务T1,T2,T3的一个调度。s是一个串行调度,执行的顺序是T2→T1→T3。串行调度可以保证事务的隔离性和一致性,串行调度是正确的调度。但是串行调度完全排斥事务的并发性,效率太低,不可接受。
  串行化理论提供了判断并发调度等价于串行调度的方法,把等价于串行调度的调度称为可串行化调度

4.1.1 集中式可串行化

  对同一数据项的读写操作、写写操作被称为冲突操作。例如 W 2 ( x ) , W 1 ( x ) W_2(x),W_1(x) W2(x),W1(x)是一对冲突操作, W 2 ( y ) , R 3 ( y ) W_2(y),R_3(y) W2(y),R3(y)是另一对冲突操作。冲突操作 W 2 ( x ) , W 1 ( x ) W_2(x),W_1(x) W2(x),W1(x) W 2 ( x ) W_2(x) W2(x)先于 W 1 ( x ) W_1(x) W1(x),记为 W 2 ( x ) ≺ W 1 ( x ) W_2(x)\prec W_1(x) W2(x)W1(x)。同样地, W 2 ( y ) ≺ R 3 ( y ) W_2(y)\prec R_3(y) W2(y)R3(y)。根据调度冲突关系绘制调度冲突图,图中无环则为可串行化调度,否则不能判定为可串行化调度请添加图片描述

  调度S本身是串行调度,判断为可串行化调度理所当然。调度S’是一个并发调度,用上述方法判断一下其是否为可串行化的。

在这里插入图片描述
请添加图片描述

4.1.2 分布式可串行化

  串行化理论扩展到分布式环境上才能解决分布式数据库中的调度问题。
  假设调度S’中与x数据项有关的操作以及C1操作发生在场地x上,与y数据项有关的操作以及C2操作发生在场地y上,与z数据项有关的操作以及C3操作发生在场地z上,则S’可改写成:

S x ′ = { W 2 ( x ) , R 1 ( x ) , W 1 ( × ) , C 1 , R 3 ( x ) } S'_x=\{W_2(x),R_1(x), W_1(×),C_1, R_3(x)\} Sx={W2(x),R1(x),W1(×),C1,R3(x)}
S y ′ = { W 2 ( y ) , R 3 ( y ) , C 2 } S'_y = \{ W_2(y),R_3(y),C_2\} Sy={W2(y),R3(y),C2}
S z ′ = { R 2 ( z ) , R 3 ( z ) , C 3 } S'_z=\{R_2(z),R_3(z),C_3\} Sz={R2(z),R3(z),C3}

  可分别为 S x ′ , S y ′ , S z ′ S'_x ,S'_y,S'_z Sx,Sy,Sz 绘制冲突调度图,然后合并为一张图,若无环则为可串行化调度,否则不能作出此判断

请添加图片描述

4.2 并发控制概况

现有的并发控制 ⊂ \subset 可串行化的并发控制 ⊂ \subset 正确的并发控制 ⊂ \subset 并发控制

4.3 基于锁的并发控制

4.3.1 基本概念

R L i ( x ) RL_i(x) RLi(x) W L i ( x ) WL_i(x) WLi(x)
R L j ( x ) RL_j(x) RLj(x)兼容互斥
W L j ( x ) WL_j(x) WLj(x)互斥互斥

  WL为写锁,RL为读锁。在对数据项进行操作前要上锁,如果没有遇到不兼容的锁,上锁成功才能进行实际操作,否则只有等拥有该锁的事务释放该锁时才会有机会上锁成功。

例如:
在这里插入图片描述
在这里插入图片描述

  S是关于事务T1,T2的一个基于锁的调度,其中 l r i ( z ) lr_i(z) lri(z)表示释放事务 T i T_i Ti对数据项z的锁。

  • 假设在两个事务执行之前x、y的值分别为 50 和 20,T1, T2串行的结果是多少?
    102和38,或者101和39
  • 依据调度S的执行结果是多少?
    102和39
  • 这说明S并不是一个可串行化的调度。请用可串行化理论对此作一判断。【并不是基于锁的调度就是可串行化调度】
    请添加图片描述

4.3.2 两段锁协议(2PL)

  2PL指2-phase locking,意指把事务的加锁和解锁过程分成两个阶段,加锁阶段和解锁阶段。加锁阶段只加锁不解锁,解锁阶段只解锁不加锁

在这里插入图片描述
在这里插入图片描述

4.3.2.1 集中式数据库中2PL的可串行性
4.3.2.2 分布式数据库中2PL的可串行性

4.4 死锁问题

第五章 分布式恢复

第六章 区块链技术

第七章 NewSQL数据库

第八章 NoSQL数据库

第九章 课程设计

9.1 需求

  1. 单车信息应按城市水平分片
  2. 用户量大,用户描述信息(包含用户余额)需分片。
  3. 行程信息量更大,还需记录行程轨迹(用 bigtable 类似存储)。
  4. 用户的优惠卷信息,到期自动删除。
  5. 公司的充值活动、优惠卷活动,活动结束自动删除。
  6. 充值、兑现、购买优惠卷的支付处理(跨数据库的一致性提交)。
  7. 开锁处理(含判断是否有钱)
  8. 上锁处理(含付费)

  设计文档包括表及其结构、表间的关联、表的分布设计、<key, value>存储及其与表之间的联系、关键事务的描述、主要的查询流程。

9.2 设计

9.2.1 表及其结构(类图)

9.2.2 表间的关联(ER图)

9.2.3 表的分布设计

9.2.4 <key, value>存储及其与表之间的联系(索引)

9.2.5 关键事务的描述

9.2.6 主要的查询流程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/722934.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深度学习入门5——为什么神经网络可以学习?

在理解神经网络的可学习性之前&#xff0c;需要先从数学中的导数、数值微分、偏导数、梯度等概念入手&#xff0c;从而理解为什么神经网络具备学习能力。 1.数值微分的定义 先从导数出发理解什么是梯度。某一点的导数直观理解就是在该点的切线的斜率。在数学中导数表示某个瞬…

Spring的事务步骤

一、事务处理方案&#xff1a; Spring框架中提供的事务处理方案&#xff1a;一共有两种&#xff1a; 1.适合中小项目使用的&#xff0c; 注解方案&#xff1a; 注解的方式做事务用起来简单&#xff0c;灵活&#xff0c;方便&#xff0c;中小型项目中用它比较方便&#xff0c…

白酒:酒文化的教育价值与实践

酒文化作为中国传统文化的重要组成部分&#xff0c;具有丰富的教育价值。云仓酒庄的豪迈白酒作为酒文化的品牌之一&#xff0c;在传承与发展中不断挖掘和发挥酒文化的教育价值。 首先&#xff0c;豪迈白酒有责任传承丰富的历史文化知识。从酒的起源、酿造技艺、酒器文化到酒礼酒…

Github上传大于100M的文件(ubuntu教程)

安装Git-lfs Git Large File Storage (LFS) 使用 Git 内部的文本指针替换音频样本、视频、数据集和图形等大文件&#xff0c;同时将文件内容存储在 GitHub.com 或 GitHub Enterprise 等远程服务器上。官网下载&#xff1a;https://git-lfs.github.com/ ./install.sh上传 比如…

教你如何安装 IntelliJ IDEA

安装 IntelliJ IDEA 的步骤通常如下&#xff0c;这里提供的是基于 Windows 系统的安装指南。 下载 IntelliJ IDEA 1. 访问 JetBrains 官方网站&#xff1a;[https://www.jetbrains.com/idea/download/](Download IntelliJ IDEA – The Leading Java and Kotlin IDE) 2. 选择适…

一文带你入门【论文排版】利器·LaTeX |Macos

小罗碎碎念 我在刚开始写公众号的时候&#xff0c;写过一期推文&#xff0c;详细的讲解过如何使用LaTeX快速的进行论文排版。不过当时用的是windows的系统&#xff0c;这一次把Mac端的教程补上。 windows系统教程 https://zhuanlan.zhihu.com/p/677481269 LaTeX是一种流行的排…

【UIDynamic-动力学-UICollisionBehavior-action Objective-C语言】

一、我们说,这个碰撞行为啊,collision,它里边还有一个属性,叫做action,它能够干什么,它能够实时的去监听, 1.实时的去监听,我们当前的这个view的一个frame的变化, 它会调用action的方法,实际上,action方法,它是一个block,然后呢,view的frame变化的时候,它会一直…

Keil生成bin文件

keil软件默认是只生成hex文件虽然也可以下载但是有时候要用到bin文件 只需要加入以下代码在keil软件中即可 fromelf.exe --bin -o “$LL.bin” “#L” 然后编译 输出信息&#xff0c;可以看到已经生成了bin文件

Nacos从入门到实战

一、Nacos介绍 1.什么是Nacos 官方&#xff1a;一个更易于构建云原生应用的动态服务发现&#xff08;Nacos Discovery&#xff09;、服务配置&#xff08;Nacos Config&#xff09;和服务管理平台 集 注册中心配置中心服务管理 平台 注册中心&#xff1a;把所有的服务注册进去…

第6章 设备驱动程序(3)

目录 6.5 块设备操作 6.5.1 块设备的表示 6.5.2 数据结构 6.5.3 向系统添加磁盘和分区 6.5.4 打开块设备文件 本专栏文章将有70篇左右&#xff0c;欢迎关注&#xff0c;查看后续文章。 6.5 块设备操作 特点&#xff1a; 随机访问任意位置。 固定块大小的传输。 块设备在内…

MySQL进阶——索引【核心】

目录 1索引概述 2索引结构 2.1 B-Tree&#xff08;多路平衡查找树&#xff09; 2.2 BTree 2.3 hash 3索引分类 3.1MySQL中分4类 3.2 InnoDB存储引擎分两类&#xff08;SQL优化中重要&#xff09; 4索引语法 4.1创建和查看索引 4.2删除索引 5 SQL性能分析 5.1 查看执…

Ubuntu安装docker 详细教程

Ubuntu安装docker&#xff0c;以及docker compose踩了一步一步的坑&#xff0c;真的特别抓马&#xff01;&#xff01;&#xff01; 因此分享我的安装教程和踩坑&#xff0c;希望给大家一些帮助吧 安装详细教程 卸载docker停止 docker 运行使用以下命令来卸载 Docker 软件包及其…

国产数据库中读写分离实现机制

在数据库高可用架构下会存在1主多备的部署&#xff0c;备节点可以根据业务场景分发一部分流量以充分利用资源&#xff0c;并减轻主库的压力&#xff0c;因此在数据库的功能上需要读写分离来实现。 充分利用备节点的资源&#xff0c;提升业务的吞吐量&#xff1b;防止运维等非业…

助力低空经济-eVTOL/无人机ADS-B航管应答机选型指南

一、低空经济概述 “低空经济”在今年全国两会首次写入政府工作报告。近日&#xff0c;工业和信息化部、科学技术部、财政部、中国民用航空局印发《通用航空装备创新应用实施方案&#xff08;2024—2030年&#xff09;》&#xff0c;提出到2030年&#xff0c;推动低空经济形成…

c语言回顾-结构体(2)

前言 前面讲了结构体的概念&#xff0c;定义&#xff0c;赋值&#xff0c;访问等知识&#xff0c;本节内容小编将讲解结构体的内存大小的计算以及通过结构体实现位段&#xff0c;话不多说&#xff0c;直接上干货&#xff01;&#xff01;&#xff01; 1.结构体内存对齐 说到计…

自建消息推送工具 Gotify 实现消息私有化通知

本文首发于只抄博客,欢迎点击原文链接了解更多内容。 前言 之前分享了如何通过 Webhook 将 VPS 与 NAS 上部署的应用消息推送到钉钉、飞书、企业微信,但是对于部分用户来说,可能因为以下种种原因,不方便使用常见的办公 IM 软件来进行消息推送: 消息涉及隐私敏感信息,不希…

11.6.k8s实战-节点扩缩容

目录 一&#xff0c;需求描述 二、集群缩容-节点下线 1&#xff0c;节点下线案例说明 2&#xff0c;查看现有节点 3&#xff0c;查看所有名称空间下的pod ​编辑4&#xff0c;驱逐下线节点的pod 5&#xff0c;驱逐后再次查看pod 6&#xff0c;驱逐pod后再次查看节点信息…

新书速览|Ubuntu Linux运维从零开始学

《Ubuntu Linux运维从零开始学》 本书内容 Ubuntu Linux是目前最流行的Linux操作系统之一。Ubuntu的目标在于为一般用户提供一个最新的、相当稳定的、主要由自由软件构建而成的操作系统。Ubuntu具有庞大的社区力量&#xff0c;用户可以方便地从社区获得帮助。《Ubuntu Linux运…

熟练一种编程语言再学另一种语言时,叠的是buff还是debuff?

在大多数情况下&#xff0c;尤其是对于广泛使用的高级编程语言&#xff0c;它们之间存在正向的相互促进作用&#xff0c;熟练使用一种语言后再去学习另一种语言&#xff0c;大概率能叠个buff。 首先&#xff0c;学习编程语言的基础是通用的&#xff0c;比如软硬件和网络基础、算…

iOS原生APP开发的技术难点

iOS原生APP开发的技术难点主要体现在以下几个方面&#xff0c;总而言之&#xff0c;iOS原生APP开发是一项技术难度较高的工作&#xff0c;需要开发者具备扎实的编程基础、丰富的开发经验和良好的学习能力。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xf…