テーブル定義:
contact (
contact_id SERIAL PRIMARY KEY,
contact_name text
);
connect (
connect_id SERIAL PRIMARY KEY,
contact_id int,
connect_method text
);
説明のため、簡単な二つのテーブルから構成されるデータベースを考えます(右参照)。contactは連絡先、connectは連絡方法といったところです。
両方ともID(プライマリキー)は自動で付与されています(autonumbering)。そしてconnectテーブルからcontactテーブルへcontact_idを使った参照があります。
このテーブルに次のようなデータが登録されていたとします。
| contact table | connect table | ||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
このようなデータをクライアントデータベースに同期させ、その上で操作(追加・変更・削除)を行なったとします。この結果をサーバーに同期する場合を考えます。
たとえば、クライアントで「Taro」君を追加して、連絡方法として「@twitter」を登録したとします。クライアントでは次のようなデータとなります。黄色が追加されたデータです。
| contact table | connect table | |||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
登録したデータをサーバーに送付して、サーバー上のデータベースに登録します。
問題が起こるのは、クライアント上で付与されたIDがサーバーでは使えない場合です。
クライアントが複数ある場合など、すでにcontact_idの「12」が使われているかもしれません。たとえば、同期した結果、contactテーブルのTaro君のIDに「20」が振られたとします。一方、connectテーブルはIDがそのまま使えたとします。そのままデータを登録すると次のようなデータになってしまいます。
| contact table | connect table | |||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
Taro君のtwitterのデータとの参照関係が壊れています(赤い部分)。
この部分を新しく振られたID(「20」)に修正する必要があります。
Cena-DTAなら自動で壊れた参照関係を正しく修正します。
正しく設定すればですけど。