本节书摘来自异步社区出版社《视图更新与关系数据库理论》一书中的第1章,第1.2节,作者:【美】c.j. date(达特),更多章节内容可以访问云栖社区“异步社区”公众号查看。
另一个由可交换性原则引出的问题是表s、表ls和表nls的行为不应该由基表和视图的分布来决定。为了解释这个问题,我们先假设它们全都是基表。
这样一来,所有的表就都受到约束的限制了。不过从实际情况来看,想在sql中构造这些约束条件会非常复杂,因此为了便于表达和理解,我将用普通话来描述一下这些约束条件(大部分是大白话)。
{sno}是每个表的键,同时,{sno}对于ls和nls来说是外键,引自于表s。注意:关于使用“{”和“}”的原因,请参阅《sql and relational theory》[3]。
在任何时候,表ls都等同于表s中city值为london的限定,表nls都等同于表s中city值不为london的限定。同时,表ls中每一行的city值都为london[4],表nls中的每一行都不为london。
在任何时候,表s都等于表ls和nls合并后的结果。同时要注意,这个合并是不相交的(对应的交集为空),没有数据会同时出现在表ls和表nls中。具体来说就是:表s中的每一行都会根据限定条件准确地出现在表ls或表nls中,而表ls或表nls中的每一行也必定会出现在表s中。
最后,刚刚所说的由city值引发的约束以及{sno}是所有三张表的键这个约束结合在一起,就会形成以下结果,即表s中每个具体的供应商编码(不仅是整行的信息)都会根据限定条件准确地出现在表ls和表nls当中。而表ls或表nls中的每一个具体的供应商编码也必定会出现在表s中。
当然,正如前面所说的几点所示,这些约束并不是完全独立毫不相干的,其中一些约束是另一些约束逻辑上导致的结果。