私はiPhoneアプリ/Webアプリケーションを構築しており、データベースの双方向同期を実現するための最良の方法を考えようとしています。私はおそらくiPhoneではsqliteを、Webではmysqlを使用しますが(私が知っていることですが)、それらの同期を維持する方法がわかりません。
サンプルスキーマは次のとおりです。
index_id(autoincrement)| タイトル| 金額| user_id | 作成済み(日時)
さて、私はこれにアプローチする方法について2つのその後のアイデアを持っていました、それは編集よりも答えとしてより良いだろうと思いました:
1) 2つのデータベースがあります。1つは電話用で、もう1つはWebアプリ用です。スキーマは次のようになります。
index_id | title | amount | user_id | created | environment | foreign_id
たとえば、モバイルデバイスに1、'Title'、2.00,1、NOW()のエントリがあり、Webアプリに1、'Something'、5.00,1、NOW()のエントリがあるとします。これら2つの競合を回避するために、Webアプリは2、'Title'、2.00,1、NOW()、'mobile'、1という行を追加します。
このようにして、すべてのindex_idを正しく維持できます。これは、維持して正しくするための絶対的な悪夢のようです。
2) DB(たとえばWebアプリ)をマスターとして指定し、デバイスをスレーブとして指定すると、Webアプリに1つのテーブルがあり、デバイスに2つのテーブルがあります。デバイスの場合、1つのテーブル「キュー」があり、ネットワーク接続時にライブWebアプリデータベースを更新し(同時にそれ自体をクリアします)、次にWEBAPPデータベースを一方向に同期してデバイスの2番目のメインテーブル。
同期の前に、デバイスのビジネスロジックは2つのローカルテーブルを1つとして扱う必要がありました。これは、上記よりも簡単に取り組むことができる獣のようです。
のような特定の状況に対処する必要があるため、これは問題です。A =サーバー、B = iPhone
A - Adds new entry
B - Adss new entry
A - Get B's entry
B - Get A's entry
A - Update entry
B - Delete A's entry
(どちらを使用しますか、Aが行ったBへの変更を同期しますか、それともAが行ったBのアイテムを削除しますか?)
同期部分は単純なプッシュ/プルスタイルのhttpリクエストである可能性があり、懸念を引き起こすのはそれらを適切に同期させる方法のロジスティクスです。
方法について:iPhoneにサーバーページ(update.php)で変更をチェックさせ、変更を確認します。iPhoneが送信した変更でサーバーを更新し、要求が返送する変更でiPhoneを更新します(JSONまたはXMLを使用)。
両方の場所でスキーマを複製し、すべてのテーブルの各行にタイムスタンプを投げるだけです。次に、クライアントに最新のタイムスタンプを送信させ、サーバーにそれよりも新しい行を返すようにします。
最も簡単な方法...
WebアプリケーションでiPhoneクライアントに安全な/認証されたWebサービスを提供してみませんか?
たとえば、iPhoneはこのサービスと通信し(JSON、XML、SOAPなどを使用)、1つのデータベースを維持するだけで済みます。