データベースの同期における問題

自動ID付与されるデータと参照

テーブル定義:

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
id name
10 Alan
11 Mary
id contact_id method
100 10 @twitter
101 10 @facebook
102 11 @twitter

クライアントでのデータ操作

このようなデータをクライアントデータベースに同期させ、その上で操作(追加・変更・削除)を行なったとします。この結果をサーバーに同期する場合を考えます。

たとえば、クライアントで「Taro」君を追加して、連絡方法として「@twitter」を登録したとします。クライアントでは次のようなデータとなります。黄色が追加されたデータです。

contact table connect table
id name
10 Alan
11 Mary
12 Taro
id contact_id method
100 10 @twitter
101 10 @facebook
102 11 @twitter
103 12 @twitter

サーバーのデータベースとの同期

登録したデータをサーバーに送付して、サーバー上のデータベースに登録します。

問題が起こるのは、クライアント上で付与されたIDがサーバーでは使えない場合です。

クライアントが複数ある場合など、すでにcontact_idの「12」が使われているかもしれません。たとえば、同期した結果、contactテーブルのTaro君のIDに「20」が振られたとします。一方、connectテーブルはIDがそのまま使えたとします。そのままデータを登録すると次のようなデータになってしまいます。

contact table connect table
id name
10 Alan
11 Mary
20 Taro
id contact_id method
100 10 @twitter
101 10 @facebook
102 11 @twitter
103 12 @twitter

Taro君のtwitterのデータとの参照関係が壊れています(赤い部分)。

この部分を新しく振られたID(「20」)に修正する必要があります。

Cena-DRAは自動で修正

Cena-DTAなら自動で壊れた参照関係を正しく修正します。

正しく設定すればですけど。