複数のモバイル クライアントと Web ベースのサーバー アプリケーションを含む分散アプリケーションを実装します。そのため、各クライアントとサーバーもテーブル エントリを生成できます。したがって、すべての参加者に対して一意の主キーが必要であり、キーをオフラインで生成できるようにしたいと考えています。
分散環境で使用している主キーを生成するための最良の方法は何ですか? 同様の質問については、SQLite と Azure SQL データベースを中央ストアとして使用するオンライン/オフラインのマルチクライアント モバイル アプリケーションに最適な主キー戦略は何ですか?を参照してください。
UUID キーの生成がそのシナリオに適したアプローチであることは承知していますが、Android プラットフォームで提案されているように、_id という名前と長いタイプのキーに固執したいと考えています。
デバイス(サーバーもデバイス)IDとローカルIDの複合IDを持ちたくありません。サーバーは特定のクライアントのエントリを生成できる必要があるため、このアプローチはうまく機能しません。その場合、サーバーでもデバイス ID を使用する必要があります。
したがって、私の現在のお気に入りは、長いデータ型でキーを作成することです (以前に別のプロジェクトでこれを行いました)。ハイ/ローアプローチを使用すると思います(たとえば、こちらの ハイ/ロー アルゴリズムとは?を参照してください)。
- サーバーから生成されたクライアント ID (例: ~28 ビット)
- 低い値 (例: ~ 4 ビット) クライアントでインクリメントされ、永続化されない
- 高い値 (例: ~ 32 ビット) クライアントでインクリメントされ、クライアントでのみ永続化されます
クライアント ID は、モバイル アプリケーションの最初の起動時にサーバーから取得する必要があります。したがって、最初の起動にはネットワーク接続が必要です。これは、このアプローチの欠点かもしれません。デバイスにクライアント ID がある場合、ネットワーク接続なしでキーを生成できます。
通常、上位 ID はデータベース全体で一意の値です。ユーザーがアプリケーションをアンインストールして再度インストールすると、私は彼を新しいクライアントとして扱い、新しいクライアント ID を与える必要があります。そうしないと、サーバーに現在の高IDを保存して、紛失または再インストール時に復元できるようにする必要があります-努力する価値はありません。
Androidで高いIDを取得するための最良の方法は何ですか? 自動インクリメント キーは解決策ではありません。ジェネレータ関数のようなものが必要です。また、独自のトランザクション内で実行する必要があります (「ユーザー」トランザクションではありません)。Androidでそのアプローチを経験した人はいますか?誰かが私を正しい方向に向けることができますか? (私はこの答えしか見つけませんでした)。
マルチ クライアント アプリケーション (オンラインおよびオフライン) で使用している主要な戦略は何ですか?