《视图更新与关系数据库理论》——2.3 一致性约束

2.3 一致性约束

每个关系变量都受制于一系列一致性约束,我们也可以把它们简称为约束。首先,我们在“关系和关系变量”这一节中已经知道,任何一个给定的关系变量都被约束为一个确定的类型(具体来说,是一个确定的关系类型),也就是说,在定义关系变量的时候,这个类型也就确定了。例如,我们再来看看供应商关系变量S的定义。11[11]

VAR S BASE RELATION
  { SNO CHAR , SNAME CHAR , STATUS INTEGER , CITY CHAR }
    KEY { SNO } ;

如你所见,这个定义清晰地表明了关系变量S属于类型RELATION {SNO CHAR, SNAME CHAR, STATUS INTEGER, CITY CHAR}。而且,具体来看它还表明了属性SNO、SNAME、STATUS和CITY分别是CHAR、CHAR、INTEGER和CHAR这几种数据类型。注意:后一种约束—给每个独立属性的约束,有时候被称为“属性”约束,本段就是一个很好的例子。

我再次重申一遍,任何一个关系变量(任何一个属性更是如此)都被约束为某种类型。但是关系变量同时也会被很多其他的约束所限制,这些约束通常都是使用Tutorial D的表达式明确写出CONSTRAINT声明从而实现的。12[12]下面举几个简单的例子希望能帮助大家理解(如果你需要更多的解释说明,请参阅《SQL and Relational Theory》)。

CONSTRAINT CX1 IS_EMPTY ( S WHERE STATUS < 1 ) ;
CONSTRAINT CX2 IS_EMPTY ( S WHERE CITY = ‘London’ AND STATUS ≠ 20 ) ;
CONSTRAINT CX3 IS_EMPTY ( ( S JOIN SP ) WHERE STATUS < 20 AND PNO = ‘P6’ ) ;

现在“第三宣言”中要求所有的约束都必须在声明边界上被满足(“立即检查”)。换句话说,从逻辑上讲,对于任何有潜在可能会违反“宣言”的声明,在它约束时都会被立刻重新检查一次。13[13]或者我们也可以说得有趣一点,它们是“在分号处”被检查的。因此,与SQL标准版本或其他特定的SQL产品不同,一致性检查从来都不会被推迟到执行结束或者执行COMMIT(提交)操作的时候。

最后请注意,有时为了方便,我们对于给定的关系变量R的“全局”约束,这里要强调是针对“关系变量”的全局约束,指的是所有涉及到关系变量R的约束的逻辑AND(与)。而有时为了方便,我们对于给定的数据库的“全局”约束,这里要强调是针对“数据库”的全局约束,指的是所有涉及到该数据库中任意关系变量的约束的逻辑AND(与)。

更新每次都是集合更新
尽管这个观点尽人皆知,但还是值得我们再次强调,在关系模型中的每次更新都是集合更新(更好的说法是:每次都是“关系”更新)。我们换句通俗点的话来说,INSERT操作给目标关系变量插入了一系列数组,DELETE操作将一系列数组从目标关系变量中删除。而更广义地来讲,关系赋值将一系列数组值赋给了目标关系变量。当然,我们经常会这么说(例如)“插入某某数组”,确实,我在这本书里也会时不时这样说,但是这种说法确实是很不严谨(虽然比较方便)的。不论如何,这里我要说的重点在于一致性约束的检查要在“所有的”更新步骤(包括与之相关的补偿性操作,如果有的话)全部完成后进行。换句话说也就是从逻辑上讲,一个集合级别的更新一定不能被当作一系列单独数组级别的更新来对待。

两个重要的原则
现在我要在此特别强调2个重要的原则,这2个原则对于巩固更新(尤其包括视图更新)的概念非常重要。第1条原则也被称为黄金法则。

定义:黄金法则规定所有的数据库都不能违反它自己的全局数据库约束。
显然,由此条法则我们可以立刻推导出下面的规则:所有的关系变量都不能违反它自己的全局关系变量约束。简单来讲,就如同我所强调过的,约束必须在声明边界上被满足。我再次重申,请尤其注意,这条法则无论是对视图,还是对基础关系变量,都同样适用。

第2条原则被称为“赋值原则”。

定义:“赋值原则”规定当值v被赋给变量V之后,比较表达式v=V的结果必须为TURE。
这条原则适用于所有的赋值操作,实际上,相信你也察觉到了,它基本上就是赋值本身的“定义”,不过就本文而言,它尤其能够适用于关系赋值。当然也请再一次注意,这条法则无论是对视图,还是对基础关系变量,都同样适用。

时间: 2024-10-31 09:43:06

《视图更新与关系数据库理论》——2.3 一致性约束的相关文章

《视图更新与关系数据库理论》导读

前言 视图更新与关系数据库理论本书是这个系列的第3本书,它的两位"前辈"是: <SQL and Relational Theory: How to Write Accurate SQL Code>(第2版) <Database Design and Relational Theory: Normal Forms and All That Jazz> 以上两本书于2012年由O'Reilly出版发行.第1本书的目标读者是所有种类数据库的从业人员,书中解释了关系理论

《视图更新与关系数据库理论》——第2章 技术背景

第2章 技术背景 视图更新与关系数据库理论适合我的一切也应该能适合你. --Walt Whitman<Leaves of Grass>(1885) 上一章的讨论是基于SQL的,因为大家对它都很熟悉.但实际上很可惜,SQL并不适合作为这种探究的基础,也无法满足目前手上课题对细节技术讨论的要求.一方面来讲,我们需要检验的概念很多时候完全无法用SQL语句表达:从另一方面来看,即使是可以表达的时候,SQL通常也会引入一大堆与之毫无关系而又没有必要的复杂内容,很容易使人一叶障目,不见森林.由于以上原因,

《视图更新与关系数据库理论》——第1章 抛砖引玉

第1章 抛砖引玉视图更新与关系数据库理论身教胜于言教. --Samuel Johnson<Rasselas>(1759) 本书中所涉及的大多数范例都是基于我们耳熟能详的(可别说是老掉牙的)"供应商与零部件"数据库而来的.我为再一次把这个老生常谈的例子拿出来表示歉意,但正如我在其他地方所说,我认为在各种不同的出版物上使用同样的例子对于学习而言是有利无害的.就SQL来说[1],数据库包含3张表,更确切地说,是3张基表,分别称为供应商表S("suppliers"

《视图更新与关系数据库理论》——1.6 小结

1.6 小结 抛砖引玉到此就要告一段落了.我们所用到的这个例子非常简单,从中得出的结论也是显而易见的.而其实我是想通过这个例子引出下面的理念,就是根据实际的定义把视图看作与特定的表相附生的基表,这对于整体考虑如何解决视图更新的问题是很有建设性的.我认为它不仅具有建设性,而且是一种"逻辑上正确"的方法.[8]总体思路如下. 1.视图定义表达式包含了某些特定的约束.例如,视图LS("London suppliers")的视图定义表达式表明了LS等同于表S中CITY值为L

《视图更新与关系数据库理论》——2.2 关系赋值

2.2 关系赋值 Tutorial D中的关系赋值语法,不是像INSERT或DELETE一样的缩写,而是使用如下的通用格式. R := rx 在这里"R"是一个关系变量(从语法上来说,其实就是一个关系变量的名字),"rx"是一个关系表达式,表示关系"r"和关系变量"R"是同一类型的.现在显而易见的是(这里要感谢David McGoveran的观察)任何这类赋值都在逻辑上等价于下列格式之一. R := ( r MINUS d )

《视图更新与关系数据库理论》——1.1 可交换性原则

1.1 可交换性原则 到目前为止,表S是基表,LS和NLS是视图.现在仔细观察,你会发现其实我们还可以用另一种方式来看它们,那就是把LS和NLS作为基表,而S作为视图,具体如下所示. CREATE TABLE LS ( SNO VARCHAR(5) NOT NULL , SNAME VARCHAR(25) NOT NULL , STATUS INTEGER NOT NULL , CITY VARCHAR(20) NOT NULL , UNIQUE ( SNO ) ) ; CREATE TABLE

《视图更新与关系数据库理论》——1.4 视图:约束和补偿性操作

1.4 视图:约束和补偿性操作 现在我要开始讨论本章的核心概念.如果前面两段中所涉及的表中有一部分或者全部都是视图的话,那么我们讨论的所有结论依旧成立,没有改变.例如,像之前一样,假设S是表,LS和NLS是视图. CREATE TABLE S ( .............. , UNIQUE ( SNO ) ) ; CREATE VIEW LS AS ( SELECT ... WHERE CITY = 'London' ) ; CREATE VIEW NLS AS ( SELECT ... W

《视图更新与关系数据库理论》——1.5 规则至上

1.5 规则至上 现在我们假设用户只能看到视图LS(而不是视图NLS和基表S).可以想见这个用户仍然希望可以将视图LS当作基表一样操作.当然,这个用户知道表的语义. LS:供应商SNO是已经签约的,名称为SNAME,状态值为STATUS且位于城市CITY中(London). 并且了解如下约束. {SNO}是LS的键. LS中的每一行CITY值为London. 很明显,这个用户无法向这个表插入新行,也不能更新表中的供应商编码,因为这样的操作很可能违反约束规则,而用户并不知道这些约束(必须不知道)[

《视图更新与关系数据库理论》——2.1 关系和关系变量

2.1 关系和关系变量 每一个关系都有一个"关系头"和一个"关系体",其中关系头是一系列状态和特征,而关系体则是符合关系头的一系列数组.让我们再次使用"供应商与零部件"数据库(如图2.1所示,与第1章的图1.1完全一样),供应商关系的关系头是{SNO CHAR, SNAME CHAR, STATUS INTEGER, CITY CHAR}的集合,我们假设在这里确定属性SNO.SNAME.STATUS和CITY分别被定义为CHAR.CHAR.INT