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

简介:

本节书摘来自异步社区出版社《视图更新与关系数据库理论》一书中的第2章,第2.3节,作者:【美】C.J. Date(达特),更多章节内容可以访问云栖社区“异步社区”公众号查看。

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。
这条原则适用于所有的赋值操作,实际上,相信你也察觉到了,它基本上就是赋值本身的“定义”,不过就本文而言,它尤其能够适用于关系赋值。当然也请再一次注意,这条法则无论是对视图,还是对基础关系变量,都同样适用。

相关实践学习
体验RDS通用云盘核心能力
本次实验任务是创建一个云数据库RDS MySQL(通用云盘),并通过云服务器ECS对RDS MySQL实例进行压测,体验IO加速和IO突发带来的性能提升;并通过DMS执行DDL,将数据归档到OSS,再结合云盘缩容,体验数据归档带来的成本优势。
相关文章
|
3月前
|
canal 缓存 NoSQL
Redis缓存与数据库如何保证一致性?同步删除+延时双删+异步监听+多重保障方案
根据对一致性的要求程度,提出多种解决方案:同步删除、同步删除+可靠消息、延时双删、异步监听+可靠消息、多重保障方案
Redis缓存与数据库如何保证一致性?同步删除+延时双删+异步监听+多重保障方案
|
4月前
|
消息中间件 缓存 监控
如何保证缓存和数据库的一致性?
保证缓存和数据库的一致性的做法
|
3月前
|
存储 SQL 关系型数据库
一篇文章搞懂MySQL的分库分表,从拆分场景、目标评估、拆分方案、不停机迁移、一致性补偿等方面详细阐述MySQL数据库的分库分表方案
MySQL如何进行分库分表、数据迁移?从相关概念、使用场景、拆分方式、分表字段选择、数据一致性校验等角度阐述MySQL数据库的分库分表方案。
479 15
一篇文章搞懂MySQL的分库分表,从拆分场景、目标评估、拆分方案、不停机迁移、一致性补偿等方面详细阐述MySQL数据库的分库分表方案
|
3月前
|
存储 关系型数据库 MySQL
MySQL数据库基础:约束
约束是对数据库表中字段施加的规则,确保数据的正确性、有效性和完整性。主要分为非空约束、唯一约束、默认约束、主键约束和外键约束。非空约束禁止字段值为null;唯一约束确保字段值唯一,允许null值重复;默认约束设定默认值;主键约束结合非空与唯一约束,并可设为自增型;外键约束则通过关联其他表的主键,保证数据一致性。检查约束确保字段值满足特定条件。
53 1
|
4月前
|
关系型数据库 Serverless 分布式数据库
揭秘PolarDB Serverless:大促洪峰秒级应对,无感伸缩见证科技魔法!一探云数据库管理的颠覆性革新,强一致性的守护神来了!
【8月更文挑战第13天】在云计算背景下,阿里巴巴的云原生数据库PolarDB Serverless针对弹性伸缩与高性能一致性提供了出色解决方案。本文通过一个电商平台大促活动的真实案例全面测评PolarDB Serverless的表现。面对激增流量,PolarDB Serverless能秒级自动扩展资源,如通过调用`pd_add_reader`快速增加读节点分摊压力;其无感伸缩确保服务平滑运行,不因扩展中断;强一致性模型则保障了数据准确性,即便在高并发写操作下也确保库存等数据的同步一致性。PolarDB Serverless简化了数据库管理,提升了系统效能,是追求高效云数据库管理企业的理想选择。
102 7
|
4月前
|
SQL 存储 NoSQL
从SQL到NoSQL:理解不同数据库类型的选择与应用——深入比较数据模型、扩展性、查询语言、一致性和适用场景,为数据存储提供全面决策指南
【8月更文挑战第31天】在信息技术飞速发展的今天,数据库的选择至关重要。传统的SQL数据库因其稳定的事务性和强大的查询能力被广泛应用,而NoSQL数据库则凭借其灵活性和水平扩展性受到关注。本文对比了两种数据库类型的特点,帮助开发者根据应用场景做出合理选择。SQL数据库遵循关系模型,适合处理结构化数据和复杂查询;NoSQL数据库支持多种数据模型,适用于非结构化或半结构化数据。SQL数据库在一致性方面表现优异,但扩展性较差;NoSQL数据库则设计之初便考虑了水平扩展性。SQL使用成熟的SQL语言,NoSQL的查询语言更为灵活。
89 0
|
5月前
|
缓存 NoSQL 数据库
Redis问题之在高并发场景下,保证Redis缓存和数据库的一致性如何解决
Redis问题之在高并发场景下,保证Redis缓存和数据库的一致性如何解决
168 3
|
5月前
|
canal 消息中间件 缓存
面试题:如何解决缓存和数据库的一致性问题?
面试题:如何解决缓存和数据库的一致性问题?
90 1
|
4月前
|
存储 缓存 NoSQL
基于SpringBoot+Redis解决缓存与数据库一致性、缓存穿透、缓存雪崩、缓存击穿问题
这篇文章讨论了在使用SpringBoot和Redis时如何解决缓存与数据库一致性问题、缓存穿透、缓存雪崩和缓存击穿问题,并提供了相应的解决策略和示例代码。
83 0
|
5月前
|
存储 Oracle 关系型数据库