あなたが提起した問題は、数段落では答えられないか、簡単に答えられません。それにもかかわらず、ここに私の試みがあります...
まず、採用したアプローチには多くの問題があります。
- クライアントは、データを作成し、サーバーからキーを受け取るために、常にネットワークに接続されている必要があります。
- 異なるストア (localstorage と REST) を作成する場合、データを必要とするすべてのアプリケーション コードは両方のストアを参照する必要があります。これにより、アプリケーションのあらゆる部分の複雑さが大幅に増加します。
- 行を作成した後、子行を作成する場合は、子行で主キーを外部キーとして参照する前に、サーバーが主キーを返すまで待機する必要があります。適度に複雑なデータ構造の場合、これは大きな負担になります。
- サーバーがダウンすると、すべてのクライアントがデータを作成できなくなります。
これが私のアプローチです。SequelSphereDBを使用しますが、ほとんどの概念は他のクライアント データ管理システムで再利用できます。
最初: 主キーに UUID を使用します。
ほとんどのクライアント データ管理システムは、Universally Unique ID を生成する方法を提供する必要があります。SequelSphere では、SQL 関数 UUID() を使用して簡単に実行できます。各行の主キーとして UUID を使用すると、サーバーに接続することなく、任意のクライアントでいつでも主キーを生成でき、ID が一意であることが保証されます。これにより、実行時にサーバーへの接続を必要とせずに、アプリケーションを「オフライン」モードで動作させることもできます。これにより、ダウンしたサーバーがすべてのクライアントをダウンさせることもありません。
2 番目: サーバーのテーブルをミラーリングする単一のテーブル セットを使用します。
これは、何よりもシンプルさの要件です。また、次の 2 つの基本原則の要件でもあります。
3 番目: 小さなデータセットの下位同期では、サーバーからのクライアント データを完全に更新することが推奨されます。
可能な限り、サーバーからクライアント上のデータの完全な更新を実行します。これはより単純なパラダイムであり、内部データの整合性の問題が少なくなります。主な欠点は、転送時のデータ サイズです。
4番目: 大規模なデータセットの下位同期の場合、「トランザクション」更新を実行します
ここで、私のアプローチがもう少し複雑になります。データセットが大きすぎて、変更された行のみを同期する必要がある場合は、「トランザクション」に従ってそれらを同期する方法を見つける必要があります。つまり、サーバーで実行された順序で挿入/更新/削除を実行して、クライアントで同じことを実行するための簡単なスクリプトを提供します。
デバイスに同期するトランザクションを記録するテーブルをサーバー上に置くことをお勧めします。これが不可能な場合は、多くの場合、行のタイムスタンプを使用してサーバーに注文を記録し、特定のタイムスタンプ以降のすべての変更をクライアントに要求させることができます。大きな欠点: 「論理的な」削除によって、または独自のテーブルでそれらを追跡することによって、削除された行を追跡する必要があります。それでも、複雑さをサーバーに分離することは、すべてのクライアントに分散するよりも望ましいことです。
5番目: 上方同期には、「トランザクション」更新を使用します
ここでSequelSphereDBが真価を発揮します。テーブルに対して実行されたすべての挿入、更新、および削除を追跡し、同期時にそれらを提供します。localstorage/indexeddb に情報が保持されるため、ブラウザの再起動後も同様です。コミットとロールバックも適切に処理します。クライアント アプリは、変更の記録について考える必要なく、通常どおりにデータを操作し、SequelSphereDB の「変更トラッカー」を使用して同期時に変更を再生できます。
SequelSphereを使用していない場合(使用する必要があります)、クライアントで別のテーブルを保持して、クライアントが実行するすべての挿入、更新、および削除を記録します。クライアント アプリケーションが行を挿入/更新/削除するたびに、そのコピーを「トランザクション」テーブルに作成します。上位同期時に送信します。サーバーでは、同じ手順を同じ順序で実行するだけで、クライアントにあったデータを複製できます。
また重要: サーバーからクライアント テーブルを完全に更新する前に、必ず上位同期を実行してください。:)
結論
できるだけ多くの場所で、複雑さよりも単純さを優先することをお勧めします。主キーに UUID を使用すると、これに非常に役立ちます。ある種の「変更トラッカー」を使用することも非常に便利です。SequelSphereDB などのツールを使用して変更を追跡するのが最も役立ちますが、この方法では必要ありません。
完全な開示: 私は SequelSphere 社と密接な関係にありますが、その製品は上記のアプローチを実装するために実際には必要ありません。