20

データが保存されているマスターdjangoサーバーが1つあります(mysqlデータベース)。

オンライン : 多くのユーザーに、このデータベースのコピーをラップトップ (sqlLite DB) で同期してもらいたいです (デルタのみをコピーする必要があります)。

オフライン (ユーザーはマスター サーバーにアクセスできません) : ユーザーはローカル データベースを表示および更新できます。

オンラインに戻る: ユーザーのラップトップで変更された内容は、マスター django サーバーに同期されます。

私は2種類のデータベースを持っているので、djangoオブジェクトレベルで同期する必要があると思います. それを行うdjangoアプリケーションはありますか? そうでない場合、そのような機能をどのようにコーディングしますか?

4

3 に答える 3

5

Django でこのようなシステムを実行していることがわかりました。

これは完全な答えではなく、現在(ほとんど)問題を解決している答えです。

  • 主キーの UUID の使用。これにより、さまざまなオブジェクトの主キーの衝突が大幅に減少します。
  • データ交換には Django のシリアル化フレームワークを使用します。中央管理サイトには、変更リストで選択したオブジェクトを Django 互換のシリアル化されたファイルにダウンロードするオプションがあります。その後、ユーザーはオフラインにしてローカルの管理サイトを開始し、そこでシリアル化されたファイルをアップロードできます。オフライン エディションが終了すると、同じプロセスが使用されます。「オフライン」管理サイトでは、オブジェクトがファイルにシリアル化され、中央管理サイトにアップロードされます。
  • 実際の (保存されていない) オブジェクトを取得し、それを保存するかどうかを決定し、保存する前にいくつかのフィールドを変更できるため、シリアル化フレームワークは非常に便利です。

このシンプルなシステムで問題が発生することはほとんどありません。また、コンテンツが適切に分類され、編集者が重複しない一連のカテゴリを作成/編集するだけであるため、助けにもなりました.

私は何人かの人々とこれについて話し、いくつかの解決策を提案しました:

  • タイムスタンプ フィールドを使用します。これは、保存するバージョンと破棄するバージョンを決定するのに役立ちます。
  • 市長およびマイナー バージョン番号を含むバージョン フィールドを使用します。マイナーな編集 (スペル修正など) はマイナー バージョン番号のみを更新し、メジャーな変更はメイヤー バージョン番号を更新し、マイナーを 0 に設定します。こうすることで、比較時にどちらが優先されるかを常に知ることができます。ただし、これには編集ユーザー内での教育と慣習が必要です。
  • オブジェクトの更新。オフライン編集からの更新を格納する別のモデル。次に、「チーフ」エディターがそれらを実際のオブジェクトにマージし、いくつかの追加の管理ビューを使用して違いを表示します (google-diff-match-patch などを使用)。オブジェクトにフラグを立てて、直接更新を許可することもできます。つまり、更新を保存せず、到着時に直接適用することもできます。不便なのは、「主任」編集者がすべての更新を確認する必要があることです。これは、更新される情報の量によって異なります。

これが何らかの形で役立つことを願っています。誰かがこれを実装することを決定した場合、私は彼から聞くのが大好きです.

于 2011-07-29T20:48:06.207 に答える
1

ええと、実際にそれを行うdjangoアプリがあるかどうかはわかりませんが、次のように進めます:

「offline_update」のメソッドを作成します。サーバーのデータベースへの接続では、ID がローカル データベースのオブジェクトと一致するすべてのオブジェクトを選択します。ローカル データベースを更新します。次に、残りのエントリを選択し、それらをローカル データベースに追加します。

「online_update」のメソッドを作成し、同じルーチンを逆にします。

PRO: 実装が簡単 (Objects.all() ですべてを取得し、操作して更新するか、直接保存する)

短所: 競合状態 (2 人のユーザーが同じエントリを更新した場合 (必ずしも同時にではない)、誰が最も更新されたエントリを取得したか?)

基本的に、2 つのデータベースを最新の状態に保つために、一種の「mysql-svn」を作成します。

本当に興味深いので、あなたの質問に +1 票を投じます。私はいつも (mysql 経由で) データベースをダンプしてから、ローカル データベースにロードしてきました。ジャンゴを使用せずに。

于 2011-07-29T08:21:26.183 に答える