クライアントがオンラインアプリケーションとオフラインアプリケーションの両方を必要とするプロジェクトに取り組んでいます。オフラインアプリケーションデータは、Webアプリケーションにリンクされたオンラインデータベースに手動で同期されます。
データベースはMySQLであり、一部の機能はオンラインだけでなくオフラインでも利用できる必要があります。インターネットにアクセスできないユーザーがオフラインアプリケーションを使用するとします。作業が完了し、インターネットにアクセスできるようになると、ワンクリックですべての作業/データをオンラインデータベースに同期します。
データをオンラインデータベースにプッシュする方法は知っていますが、ここでの複雑さは、データの損失やデータの不一致なしに、レコードのインデックス/主キーを順番に維持する方法です。
ユーザーがオフラインデータをオンラインに同期する場合、プライマリキーを順番に維持するにはどうすればよいですか?
プランA:差分を追跡し、重複キーを避け、データをアップロードするなどのコードを開発するために、クライアントに腕と脚を課します。
プランB:マルチソースレプリケーション(少なくともMariaDBで利用可能)。
マルチソースを使用すると、オフラインの各ラップトップを「マスター」にすることができます。 「オンラインサーバー」はスレーブです。すべての書き込みはマスターで行う必要があります。オンラインスレーブに書き込めないことは問題になりません。必要に応じて、本社にオフラインのマスターを追加してください。
重複キーについては-そのような問題を回避するためにスキーマを設計する必要があります。これはおそらくAUTO_INCREMENT
またはFOREIGN KEYS
。オフラインマスターごとに、トラブルの原因となるものがなければ生きていけないもののために、個別のテーブル(または個別のデータベース)があることを意味します。しかし、それは、各接続の後にある種の解決コードがあることを意味します。 (アップロードはレプリケーションを実行するだけです。)
プランC:MySQL Cluster。これは、MySQLで使用できる大幅に異なるエンジンです。セットアップは複雑です。ただし、レプリケーションには別のモデル、つまり「結果整合性」が提供されます。重複キー(など)に頼るのではなく、そのような状況で何をすべきかについてのルールを提供します。これらのルールは、レプリケーションによって競合が発生したときに自動的に適用されます。
プランD:Galera Cluster(MariaDB 10.xに組み込まれ、MySQLに手動でインストール可能)-このクラスタリングテクノロジーを使用すると、「ノード」が行き来できます。再接続すると、自動的に同期されます。しかし...常に定足数が必要です。つまり、50%以上がオンラインです。任意のノードに書き込むことができますが、クォーラムの一部ではないノードに書き込むことはできません。
プランE:接続を維持するようにクライアントを説得します。または、切断時に書き込みを行わないでください。この場合、オフラインマシンは読み取り専用スレーブにすることができます。書き込みは、リモートマスターへの接続を待機する必要があります。
注:いずれの場合も、読み取り専用にできるものではなく、書き込みに必要なアプリアクションに明示的に目を向けてアプリケーションを作成する必要があります。 2つの別々の接続を使用することをお勧めします-1つは書き込みおよび関連する読み取り、1つは通常の読み取り用。これにより、選択したプランが容易になります。
どちらをお勧めしますか?私はあなたの状況についてどれを言うのに十分なことを聞いていません。