Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » SQL Remote » SQL Remote 复制设计 » SQL Remote 复制设计和设置

 

使用有交集分区

当远程数据库共享数据时,数据分区是有交集的。例如,销售代表相互之间就共享客户。

假设有三个表存储着销售代表和客户之间的交互信息:Customers、Policy 和 SalesReps。每个销售代表都向若干个客户销售产品,并且某些客户与多个销售代表都有业务来往。Policy 表具有指向 Customers 表和 SalesReps 表的外键。在 Customers 和 SalesReps 之间存在多对多的关系。

Policy 表具有指向 Customers 表和 SalesReps 表的外键。
Customers、Policy 和 SalesReps 表的说明

下表介绍了 Customers、Policy 和 SalesReps 数据库表,详见使用有交集分区

说明

Customers

与该公司有业务来往的所有客户。Customers 表包含以下各列:

  • cust_key   包含每个客户的标识符的主键列。

  • name   包含每个客户的名称的列。

可使用以下语句创建此表:

CREATE TABLE Customers (
   cust_key CHAR(12) NOT NULL,
   name CHAR(40) NOT NULL,
   PRIMARY KEY (cust_key)
);

Policy

一个由三列组成的表,用于维护客户与销售代表间的多对多关系。Policy 表包含以下几列:

  • policy_key   包含销售关系标识符的主键列。

  • cust_key   包含销售关系中客户代表的外键的列。

  • rep_key   包含销售关系中销售代表的外键的列。

可使用以下语句创建此表:

CREATE TABLE Policy (
   policy_key CHAR(12) NOT NULL,
   cust_key CHAR(12) NOT NULL,
   rep_key CHAR(12) NOT NULL,
   FOREIGN KEY ( cust_key )
   REFERENCES Customers ( cust_key )
   FOREIGN KEY ( rep_key )
   REFERENCES SalesReps (rep_key ),
   PRIMARY KEY ( policy_key )
);

SalesReps

在该公司工作的所有销售代表。SalesReps 表包含以下几列:

  • rep_key   每个销售代表的标识符。这是主键。

  • name   每个销售代表的姓名。

可使用以下语句创建此表:

CREATE TABLE SalesReps (
   rep_key CHAR(12) NOT NULL,
   name CHAR(40) NOT NULL,
   PRIMARY KEY (rep_key)
);
数据分区

客户和销售代表之间的多对多关系对正确共享信息提出了新的挑战。

销售代表必须预订提供以下信息的发布:

  • 整个 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 选项