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 のレプリケーション設計と設定

 

重複分割の使用

リモート・データベースがデータを共有している場合、データ分割は重複となります。たとえば、営業担当者は、担当者間で顧客を共有します。

3 つのテーブル 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

顧客と営業担当者間の多対多の関係を管理する、3 つのカラムで構成されたテーブル。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 オプションの使用