首页 理论教育分布式数据库技术-保障语义完整性

分布式数据库技术-保障语义完整性

【摘要】:本节讨论分布式语义完整性控制问题。分布式DBMS涉及完整性子系统的两个主要问题:分布式完整性断语和断语的推行。因为断语涉及的数据可能存放在不同的节点,因此必须确定它们的存储情况,以便使完整性检查的开销最小。在分布式数据库系统中,强加分布式完整性断语比在集中式DBMS中更复杂。分布更新涉及的每个节点强制验证与自己节点有关的断语。 考虑例4.10所示的函数依赖性。

本节讨论分布式语义完整性控制问题。

假设站点都有自主性,即像集中式DBMS中的一样,每个站点都能处理本地查询和实施数据控制。这个假设可以简化方法的描述。

分布式DBMS涉及完整性子系统的两个主要问题:分布式完整性断语和断语的推行。

1.分布式完整性断语

完整性断语可以用元组关系演算来表示。每个断语可以看成一个查询量词,可以判别每个元组为真还是为假。因为断语涉及的数据可能存放在不同的节点,因此必须确定它们的存储情况,以便使完整性检查的开销最小。

可以将完整性断语分成如下三类。

(1)单独断语:是指单关系、单变量断语,例如,域约束就是单独断语。

(2)面向集合的断语:包括单关系多变量约束(如函数依赖性)和多关系多变量约束(如外键约束)等。

(3)涉及聚合的断语:因为要计算聚合(如求和、计数和求均值等),所以要求对这类断语进行专门的处理。

如果要定义一个新的完整性断语,则可以从断语涉及关系的某个存储节点来启动。当然,事情并非那么简单,原因是在分布式数据库系统中,这个关系可能是分片的,而数据片又分布在不同的节点中。

我们研究的分片谓词,也可以看成是第一类断语(单独断语)的一个特例。同一个关系的不同数据片可以存放在不同的节点上。因此,一个完整性断语的定义也就变成一个分布操作。这样的操作可以分为两步:第一步是把高级断语变成编译后的断语,第二步是按照断语的分类选择适当的节点存放起来。第三类断语的处理方式与第一类和第二类的类似,取决于是单独断语还是面向集合的断语。

2.断语的推行

下面对断语的推行(即强制实施)进行深入讨论。

单独断语是将断语定义发送到与断语相关关系的所有数据片的存放节点。这个断语必须与每个节点的关系数据兼容。

可以分两级来测试兼容性:首先,测试断语与关系分片谓词是否兼容,假设断语C和数据片的分片谓词p是不兼容的,即“C is true”蕴含“p is false”,否则就是兼容的。如果发现断语和分片谓词不兼容,则该断语被拒绝。其次,如果发现分片谓词是兼容的,则该断语再测试数据片的实例。如果发现实例不满足该断语,则该断语被拒绝。如果是兼容的,则该断语存放在每个节点中。实际上,这种兼容性测试只与插入(insert)操作有关。

【例4.16】 考察关系Student,它按如下谓词水平分布:

p1:0<sno<30

p2:30≤sno≤60

p3:sno>60

在这个关系上,我们再定义一个域断语C:sno<40。

这里,断语C与p1兼容(即C为true,p1也为true)。同样,断语C与p2兼容(即C为true,p2不一定是false),但与p3不兼容(即若C为true,则p3为false)。因此,从全局看,应当拒绝断语C,因为p3不满足C。

面向集合的断语是多变量的,涉及连接谓词。断语谓词也可能是多关系的,但是编译后,一个断语只涉及一个关系。这样,断语定义可以发送到所有通过这些变量访问的数据片存放节点中。兼容性测试也与连接谓词用到的关系数据片有关。这时,仅满足谓词兼容是没有用的,因为仅此无法判断是否和分片谓词矛盾。因此,光靠查阅数据字典解决不了问题,断语C必须针对数据进行检验。这样,就需要将断语涉及的两个关系的每个数据片进行连接,开销较大,因此需要查询优化。此时,需要考虑下面三种情况。

(1)所涉及两个关系中的一个关系R的分片是从另外一个关系S中导出的(其连接呈简单连接形态),这样实施时对应数据片的连接即可。

(2)S是按连接属性分片的。

(3)S不是按连接属性分片的。

第一种情况的兼容性测试的成本较低;第二种情况中R的每个元组必须与S的一个数据片比较。第三种情况中R的每个元组必须与S的所有数据片比较。

【例4.17】 考察例4.14中定义的面向集合的编译后断语(SC,INSERT,C1),其中C1为∀NEW∈SC+,∃j∈COURSE:NEW.cno=j.cno,这里的NEW是指新增加(插入)的记录(元组)。

这个断语表述的是参考完整性。现在来考虑下面三种情况。

(1)SC是按导出水平分片的,分片的谓词是SC∝cno COURSEi

其中:COURSEi是关系COURSE的一个数据片。这种情况下,兼容性测试涉及的是简单连接形态。

(2)COURSE是按如下两个谓词水平分片的:

P1:cno<9(www.chuimin.cn)

P2:cno≥9

SC的每个元组NEW在NEW.cno<9时要和COURSE1比较,SC的每个元组NEW在NEW.cno≥9时要和COURSE2中的所有元组比较。

(3)COURSE是按如下两个谓词水平分片的:

P1:CNAME="Computer Networks"

P2:CNAME≠"Computer Networks"

此时,SC的每个元组必须同时与COURSE1和COURSE2的所有元组比较。

在分布式数据库系统中,强加分布式完整性断语比在集中式DBMS中更复杂。主要问题在于,此时必须决定该到哪里(哪个节点)去强加断语。选取标准取决于断语的种类、更新的种类和发布更新的节点(常称为查询主节点)的特点。这个节点可能是完整性断语涉及的(所有或部分)更新关系存放的节点,也可能不是。这里要考虑的主要因素是数据(包括消息)从一个节点传到另外一个节点花费的开销。

下面按照上述判据考虑不同的策略。

单独断语考虑两种情况:若更新操作是一条插入语句,则要插入的元组是由用户指定的。此时,所有的单独断语可以强加在更新提交的节点中。若更新是一个限定条件的更新(删除或修改语句),则可以将它发送到存放被更新的数据节点中。查询处理器对每个数据片执行更新限定判断。分布更新涉及的每个节点强制验证与自己节点有关的断语。

面向集合的断语则先研究单关系约束。

【例4.18】 考虑例4.10所示的函数依赖性。与INSERT更新相关的编译后的断语如下:

(Student,INSERT,C)

其中,C为:

其语义解释为:必须检查插入的新元组和现有元组间的约束(这里是函数依赖性)是否保持式(1);最后一行检查插入的元组间的约束(函数依赖性)是否保持式(2)。

现在我们来考查一个对Student的更新。

首先,更新限定条件由查询处理器来执行,假设这个更新是一个插入操作,则每个存放Student数据片的节点必须强制以上所述的断语C。由于断语C中的e是全程变量,所以每个节点上的局部数据都要满足C。

这样,提交更新的节点必须接收来自每个节点的消息,说明断语是否满足条件。如果有一个节点的断语不为真,则它发送出错消息,说明断语不成立,更新就变得无效。完整性子系统的响应则决定是否拒绝整个程序。

下面定义一个约束维持算法CK(Constraint_Keep)。

算法4.1 CK

通过例4.18所示的断语来描述算法。

令u为一个插入更新,目的是往SC中插入一个新元组。前面介绍的算法中使用了编译后断语(SC,INSERT,C),其中C为:

∀NEW∈SC+,∃j∈COURSE:NEW.cno=j.cno

针对这个断语,相应的检索语句是在SC+中检索所有C不为真的元组。其SQL形式如下:

Select NEW.*

f rom SC+NEW,COURSE

where COUNT(Select COURSE.sno f rom SC+NEW,COURSE where NEW.cno=COURSE.cno)=0

其中,NEW.*表示SC+的全部属性。

这样,可以采用的策略是把新元组发送到存放关系COURSE的节点上,以便实施连接操作。然后,在查询主节点上把所有的结果都集中起来。对于存放COURSE的数据片的节点来说,那里要实施和SC+(即NEW)数据片的连接,把结果发送到主节点,并实施结果的归并。如果归并的结果为空,则表示数据库是一致的;否则,表示数据库是不一致的。依据分布式DBMS的程序管理员所采取的策略,拒绝该程序。

涉及聚合的断语:因为要计算聚合函数等断语,所以测试开销较大。这类聚合函数通常是MIN、MAX、SUM和COUNT。每个聚合函数包括两部分:投影部分和选择部分。为了有效地强制断语,可以使用后面讨论的聚集函数优化技术。

分布式完整性控制的主要问题是,强制分布断语的通信和处理开销可能是非常高的。设计分布式完整性子系统的主要目标是分布断语的定义和强制算法的定义,这种算法应使分布式完整性检验的开销最小。基于语义完整性断语的编译这样一种预防方法,可以实现分布式完整性控制。这种方法是通用的,因为各种断语都可以用一阶谓词逻辑来处理。它也能和分片定义及节点间通信最小化兼容。小心地定义数据片可以进一步提高分布式完整性强制的性能。因此,分布式完整性约束的定义是分布式数据库设计的一个重要方面。