2012-09-04 14 views
7

現在、私はHTML5 SQL-Liteデータベースにデータを格納するプロジェクトを行っています。HTML5アプリケーションのデータベース同期

TransData: 
----------------------------------------------------------- 
| TID | UserName | TransColor | ... | Date | Note | 
----------------------------------------------------------- 
| 6 | Brendan |  Red | ... |  |  | 
----------------------------------------------------------- 
| 7 | Brendan |  Red | ... |  |  1 | 
----------------------------------------------------------- 

FullData: 
----------------------------------------------------------- 
| TID | UserName | TransColor | ... | Date | Note | 
----------------------------------------------------------- 
| 1 | Brendan |  Red | ... |  | Start | 
----------------------------------------------------------- 
| ... | Brendan |  Red | ... |  |  | 
----------------------------------------------------------- 
| 40 | Brendan |  Red | ... |  | End | 
----------------------------------------------------------- 

SalamanderData: 
---------------------------------------------------- 
| SID | SalamanderName | Length | ... | TID | 
---------------------------------------------------- 
| 1 | Northern-Slimy | 16 | ... | 6 | 
---------------------------------------------------- 
| 2 | Two-Lined | 26 | ... | 6 | 
---------------------------------------------------- 
| 3 | Two-Lined | 12 | ... | 7 | 
---------------------------------------------------- 

SalamanderData: 
---------------------------------------------------- 
| SID | SalamanderName | Length | ... | TID | 
---------------------------------------------------- 
| 1 | Northern-Slimy | 16 | ... | 6 |  
---------------------------------------------------- 
| 2 | Two-Lined | 26 | ... | 6 | 
---------------------------------------------------- 
| 3 | Two-Lined | 12 | ... | 7 | 
---------------------------------------------------- 

注:(4表)以下のように現在、私は、スキーマを持っているTransDataの「注意」の欄にはFullDataフィールドのコレクションの開始データポイントを指すために使用されています。

私のアプリとサーバ間のデータベースは、SYNCすべきではありません。私は単にこれらのテーブルのすべてをサーバー上のデータベースにダンプしようとしています(ダンプによって、他のテーブルへの参照を更新し、サーバーデータベースに挿入する)。

私はMAX(TID-Server) + TID-App = new TID-Serverを使用して、テーブルの下の更新をカスケードするつもりでした。

どうやってこれをやりますか?

+0

誰でも手助けできますか?私は挿入されたアイテムへの更新を最初にカスケードする挿入クエリを書く方法を理解できません。 – Brendan

+0

SalamanderDataを2回表示します。私はあなたの質問を正しく理解している場合、 "サーバー側"と同様のテーブルスキーマを持つ4つのテーブル "クライアント側"があります。テーブルは同期されておらず、同期されませんが、4つの "クライアントサイド"テーブルの内容を必要に応じて更新または挿入されるサーバーに送信する必要があることがあります。大きな課題は、主キーです。もちろん、同期しない(または重複する可能性があります)。これは近いですか? –

+0

それはまさにそれです。はい、私は誤ってSalamanderDataテーブルを2回コピーしました。これは、BugDataテーブルであると考えられています。このテーブルには、ムカデやヤモリなどのさまざまなバグの数が表示されます。挿入時に主キーを更新して、テーブルと他のものに同期させる必要があります。 – Brendan

答えて

6

Dan Pichelmanによってコメントから、問題はクライアントがそうする、ローカルDBにレコードを挿入していることで、彼らのために主キーを決定しなければなりません。しかし、すべての異なるクライアントが同じことをしている場合、新しいPKはサーバに衝突したときに衝突します。

これは一般的な問題は、共有シーケンス発生器のような単一障害点が存在することができない(少なくとも時々)またはここで物理的に切断されているシステムです。

いくつかの一般的な解決策は、次のとおり

GUID

ここPKは128ビット(またはそれ以上)の乱数です。任意の2つのPKが同じであるという機会は、が非常に小です。しかし、衝突の変化をさらに減らすために、GUIDアルゴリズムには、一意のマシン識別子(ネットワークMAC)と時間を含むシーディングが含まれています。同じマシンで生成された2つのGUIDは決して衝突しません。また、異なるMACを持つマシンで生成されたGUIDも衝突しません。ほとんどのマシンと言語には、GUIDを生成するためのネイティブ関数がありますが、JavaScriptにはありません。

が、PKは(ビットフィールド実際に)再び多数。この方式では、パーティションの命名スキーム

、そしてあなたはにそれを分割:参照してください。階層的な方法。良い例は、国際電話システム(少なくとも移植可能な番号の前)です。 1

  • エリアコード - 例えばUSA:例えばサニーベール - 交換によって制御さ615
  • 加入者番号、国コード

    • :ここでは電話番号が分かれています。あなたのケースでは

    、次の方法で番号を分割可能性があります

    • ユーザログイン(ユーザごとに固有例えば数)
    • セッションID(ユーザーごとに各ログオンに固有例えば数、あなたは区がありますすべての3つを組み合わせる

    シリアル番号

  • )同じユーザの異なるセッションの間ではなく別のブラウザ/コンピュータ上を区別するためにユニークなPKを与えてください。

    PK免許「サーバー

    最初の二つの提案は、彼らが完全に切断働くメリットがあります。クライアントが接続されている場合は、に、クライアントが要求したときにPKを提供するWebサービスを持つことができます。

    効率を上げるために、たとえば100個の数値のバッチが返されることがあります。これは、ユーザーがログオンしても返される可能性があります。

    クライアントはそれらをすべて使用して、より多くを要求できます。クライアントが状態を忘れて、グローバルPKシーケンスに「穴」を残す場合があります。これはほとんど確実に懸念されません。

    いくつかの考慮事項

    時には、表の順序付けの目的のために、シーケンシャルのPKを好むかもしれません。どのような場合には、クライアントまたは作成時に注文する必要がありますか?いずれかが重要な場合は、パーティションの命名方式を高く評価することができます。クライアントまたは時刻をの最初のパーティションに変更してください。または、テーブルに列を追加します。

    パーティション命名規則の固定構造が必要ない場合は、GUIDがうまく機能します。

    中央調整を行う場合は、PKライセンスサーバーを使用します。

    0

    私はこれを行うには美的な方法を知りませんが、私は、ストアドプロシージャを書き込むことによって、それを「解決」:

    最初のテーブルは簡単です - 更新するか、必要に応じて挿入します。挿入を行う場合は、新しく挿入されたレコードの主キーを取得し、それに応じて従属テーブルを処理します(通常は新しい主キーでデータを挿入することを意味します)。あなたが関係を歩くときに必要に応じて繰り返す。 4つのテーブルでは、あなたはOKでなければなりませんが、私は私の場合、それは厄介だったし、それらにoldPKとnewPKとの一時的なルックアップテーブルを含んで40

    のためにそれを行うことを憎みます。

    また、その唯一の欠点を補う機能、それが動作することで、コードのかなり長い&退屈なビットでした。

    0

    これはあなたが求めていたものと少し違うので、これが完全に行の範囲外である場合はコメントして削除します。しかし、あなたはプライマリキー(私の意見では本当にここで問題になっています)に関してサーバ/クライアントが同期できない理由について何も特定していませんでした。

    私はまた、時折サーバーにアップロードされる、ユーザーが作成したコンテンツ(ログなど)を使ってWebアプリケーションについて話していることを前提としています(データと質問から)。

    スポーツのためだけに、いくつかのフィールドで作成された主キーの使用を検討しましたか?そうすれば、ローカルデータベースに自動インクリメントができ、そのデータをサーバーにダンプすることができ、他のユーザーのデータと衝突することはありません。 SalamanderDataテーブルの例は、次のような行です。

    CREATE TABLE SalamanderData 
    (
        SID int NOT NULL, 
        SalamanderName varchar(255), 
        Length int, 
        ... ..., 
        TID int NOT NULL, 
        CONSTRAINT pk_SDataEntry PRIMARY KEY (SID,TID) 
    ) 
    

    これは、SIDとTIDからPKを作成します。

    は私のポストを通して読むと、他の答えをチェックし、私はこれはアンドリューが提案したものであることを認識するので、これはあなたを助けたとしても、あなたが本当に目的のために答えを維持

    彼の答えを受け入れる必要があります解決策を明らかにしてコード例を与える可能性があります

    関連する問題