ユーザーがオンラインに戻ったときにサーバーと同期されるデータをユーザーが作成できるオフライン モードをサポートするインターネット アプリケーションがあります。このため、データベースのアイデンティティに UUID を使用しているため、切断されたクライアントは、別のクライアントが使用する ID を使用することを恐れずに新しいオブジェクトを生成できます。ただし、これは、このユーザーが所有するオブジェクトに対してはうまく機能します。複数のユーザーによって共有されるオブジェクトです。たとえば、ユーザーが使用するタグはグローバルである可能性があり、リモート データベースがユニバース内の可能なすべてのタグを保持できる方法はありません。
オフライン ユーザーがオブジェクトを作成し、いくつかのタグを追加した場合。これらのタグがユーザーのローカル データベースに存在しないため、ソフトウェアがタグの UUID を生成するとします。これらのタグが同期されると、重複を解決するための解決プロセスが必要になります。リモート データベース内の既存のタグをローカル バージョンと照合する何らかの方法。
1 つの方法は、グローバル オブジェクトが自然キー (タグの場合は名前) によって解決されるプロセスを使用することです。ローカル データベースは、既存のオブジェクトをグローバル データベースのオブジェクトに置き換える必要があります。他のオブジェクトへの接続が多数ある場合、これは面倒な場合があります。これを避けるように何かが私に言います。
これを処理する別の方法は、2 つの ID を使用することです。1 つのグローバル ID と 1 つのローカル ID。UUID を使用することでこれを回避できると期待していましたが、単一の UUID を使用する場合と 2 つの分割 ID を使用する場合を行き来しています。このオプションを使用すると、問題を手に負えなくなったのではないかと思います。
もう 1 つの方法は、非共有オブジェクトを通じてすべての変更を追跡することです。この例では、ユーザーがタグを割り当てたオブジェクトです。ユーザーがオフラインでの変更を同期すると、サーバーはユーザーのローカル タグをグローバル タグに置き換える場合があります。次にこのクライアントがサーバーと同期するときに、非共有オブジェクトの変更が検出されます。クライアントがそのオブジェクトをプルダウンすると、グローバル タグを受け取ります。ソフトウェアは、非共有オブジェクトをサーバーのタグに向けて再保存し、ローカル バージョンを孤立させます。これに関するいくつかの問題は、完全に同期するための余分なラウンド トリップと、孤立したばかりのローカル データベース内の余分なデータです。システムが同期状態の間にあるときに発生する可能性のある他の問題やバグはありますか? (つまり、サーバーと通信して、オブジェクトのローカル UUID を送信しようとするなど)。
もう 1 つの方法は、一般的なオブジェクトを避けることです。私のソフトウェアでは、それは受け入れられる答えになる可能性があります。私はユーザー間でオブジェクトを共有することはあまりしていませんが、それは将来もそうしないという意味ではありません。つまり、このオプションを選択すると、将来、これらのタイプの機能を追加する必要が生じた場合、ソフトウェアが麻痺する可能性があります. この選択には結果が伴いますが、それらを完全に調査したかどうかはわかりません。
だから私は、あらゆる種類のベストプラクティス、このタイプのシステムを処理するための既存のアルゴリズム、選択に関するガイダンスなどを探しています.