当远程数据库共享数据时,数据分区是有交集的。例如,销售代表相互之间就共享客户。
假设有三个表存储着销售代表和客户之间的交互信息:Customers、Policy 和 SalesReps。每个销售代表都向若干个客户销售产品,并且某些客户与多个销售代表都有业务来往。Policy 表具有指向 Customers 表和 SalesReps 表的外键。在 Customers 和 SalesReps 之间存在多对多的关系。
下表介绍了 Customers、Policy 和 SalesReps 数据库表,详见有交集分区。
表 | 说明 | ||
---|---|---|---|
Customers |
与该公司有业务来往的所有客户。Customers 表包含以下各列:
可使用以下语句创建此表:
|
||
Policy |
一个由三列组成的表,用于维护客户与销售代表间的多对多关系。Policy 表包含以下几列:
可使用以下语句创建此表:
|
||
SalesReps |
在该公司工作的所有销售代表。SalesReps 表包含以下几列:
可使用以下语句创建此表:
|
客户和销售代表之间的多对多关系对正确共享信息提出了新的挑战。
销售代表必须预订提供以下信息的发布:
整个 SalesReps 表 此项目没有限定符,因此发布中包含整个 SalesReps 表。
... TABLE SalesReps, ... |
Policy 表中那些所包含的销售关系涉及到预订该数据的销售代表的行 该项目使用一个 SUBSCRIBE BY 预订表达式来指定用于在销售代表间对数据进行分区的列:
... TABLE Policy SUBSCRIBE BY rep_key, ... |
该预订表达式可确保每个销售代表只接收表中那些 rep_key 列的值与预订中提供的值匹配的行。
Policy 表分区无交集:不存在任何由多个预订者共享的行。
Customers 表中那些列出与预订数据的销售代表有业务来往的客户的行 Customers 表没有引用在预订中使用的对数据进行分区的销售代表值。此问题可以通过在发布中使用子查询得到解决。
Customers 表中的每一行都可能与 SalesReps 表中的多个行相关,并被多个销售代表的数据库共享。也就是说,存在重叠预订。
含有子查询的预订表达式用于定义分区。该项目定义如下:
... TABLE Customers SUBSCRIBE BY ( SELECT rep_key FROM Policy WHERE Policy.cust_key = Customers.cust_key ), ... |
Customers 分区是相交的:某些行由多个预订者共享。
以下语句创建完整的发布:
CREATE PUBLICATION SalesRepData ( TABLE SalesReps, TABLE Policy SUBSCRIBE BY rep_key, TABLE Customers SUBSCRIBE BY ( SELECT rep_key FROM Policy WHERE Policy.cust_key = Customers.cust_key ) ); |
Customers 项目中的子查询在其结果集中返回单个列 (rep_key),但可能返回多个行,这些行对应于那些与特定客户有业务来往的所有销售代表。如果某个预订表达式具有多个值,则会将行复制给其预订与这些值中的任意一个值相匹配的所有预订者。这种具有多值预订表达式的可能性实现了对表的有交集分区。
在预订者之间重新指派行时保持参照完整性
用于多对多关系的 subscribe_by_remote 选项
![]() |
使用DocCommentXchange讨论此页。
|
版权 © 2013, SAP 股份公司或其关联公司. - SAP Sybase SQL Anywhere 16.0 |