2

サーバーデータベースとの間で同期されるレコード (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 です。この場合、クエリはより単純になります (ケース)。

これが最善のアプローチでしょうか、それとも使用すべきより良い設計がありますか?

4

1 に答える 1

1

ローカル/サーバー ステータス フィールドを取り除き、両方の側のいずれかがレコードを変更すると、現在の日付に設定されるタイムスタンプ/バージョン フィールドを導入します。したがって、どの行が最新のレコード (タイムスタンプが最も高いレコード) であるかを常に把握できます。古いバージョンの機能に戻すために、レコードの 1 つのバージョンを戻す/進めるオプションを提示することを検討します。ユーザーが元に戻す古いバージョンを 1 つ選択した場合、そのバージョンの新しいコピーを現在のタイムスタンプで保存します。

プロトコルで (不明なタイムスタンプ) レコードのすべてまたはサブセットを転送することにより、簡単な同期を実装できる場合があります。クライアントとサーバー側で特定のテーブルのタイムスタンプのリストをダンプし、デルタのリストを比較して、反対側の挿入ステートメントを準備することを検討してください。出来上がり、同期が完了しました。常に考慮する必要があるのは、行を更新するのではなく、新しいタイムスタンプで新しいバージョンを作成することだけです。

これは、データ ウェアハウス システムにおけるほぼベスト プラクティスです。(更新の理念はありません)

レコードごとに多数のバージョンがあることに気付いた場合、新しいバージョンが N 個ある場合は、最も古いレコードを定期的に破棄することがあります。

于 2012-08-26T10:35:14.973 に答える