サーバーデータベースとの間で同期されるレコード (sqlite 内) を動作 (作成、編集) する iOS アプリを構築しています。アプリ内のレコードがサーバーからダウンロードされ、ローカルで変更された場合、サーバー バージョンに戻せるようにするため、コピーを作成しています。したがって、特定のレコード ID に対して、2 つのコピー (サーバー、ローカル) を持つことができます。データベース レイアウトの設計について支援を求めています。
最初に、2 つのテーブルを使用しました。1 つはサーバー レコード (同期経由で到着) を格納するためのもので、もう 1 つはローカルで変更された/ローカルで作成された (まだ同期されていない) レコードを格納するためのものです。(a) 集約検索 (ローカルで変更されたコピーを優先してレコードを選択する) を行う必要があり、(b) あるテーブルから別のテーブルにデータを移動する必要があったため、このアプローチは面倒であることがわかりました。 (c) スキーマが非常に複雑 (数百の列) であり、2 つのテーブル スキーマを同期して維持することは困難でした。
次に、ステータス列 (サーバー/ローカル) を追加して、すべてを 1 つのテーブルにマージしました。重複レコード (サーバーとローカル コピーの両方が存在するレコード) をフィルター処理するのがいかに複雑であるかを理解するまでは、これで問題ないように思えました。必要な 10 行の複雑なクエリのカウント、検索、選択 (sqlite の制限のため) -こことここで私の他の質問を参照してください。
私は現在、すべてを 1 つのテーブルに保持することを検討していますが、ステータス列を捨てて、ステータスを追跡するための別のテーブルを、レコードごとに 1 行、次のように作成します。
データ:
id recordID name col2 col3 ...
1 1001 Server record, not changed locally xxxx xxxx ...
2 1002 Server record changed locally xxxx xxxx ...
3 1002 Server record changed locally xxxx yyyy ...
4 1003 Record created locally xxxx xxxx ...
5 1004 Server record changed locally xxxx xxxx ...
6 1004 Server record changed locally xxxx yyyy ...
ステータス追跡:
id recordID server local
1 1001 1
2 1002 2 3
3 1003 4
4 1004 5 6
上記の情報を集約して表示するということは、ローカル レコードがある場合はそれを表示することを意味し、そうでない場合はサーバー レコードを表示することを意味します。この場合、データ行 1、3、4、および 6 です。この場合、クエリはより単純になります (ケース)。
これが最善のアプローチでしょうか、それとも使用すべきより良い設計がありますか?