2015-10-01 27 views
5

私はリレーショナルデータベース(mysql)データからnosql(mongoDb)に移行しようとしています。しかし、どうすればmongodbでデータの整合性を確保できますか?私はサーバー側ではできないことがわかった。アプリケーションの側面でデータの整合性を処理するためにはどうすればよいですか?mongoDbのデータの完全性をどのように確保できますか?

たとえば:私は2つのテーブルのユーザーとタスクがあります。両方ともuserIdフィールドを共通にしています。タスクテーブルに新しいエントリを追加すると、useridがユーザテーブルに存在するかどうかを確認する必要があります。 これは制約の追加、値の更新などの要件の1つです

+0

シナリオに[nosql](http://stackoverflow.com/questions/2875432/use-cases-for-nosql)を使用してもよろしいですか? – Pio

+0

私はできるだけpocをやっているだけです。 – rahul

答えて

2

MongoDBはFOREIGN KEYをサポートしていません。 JOINSを避ける​​ために使用します。

MongoDBは、サーバー側の外部キー関係をサポートしていません。

  1. マニュアルの参照あなたが参照として別の文書内の1つの文書の_idフィールドを保存します。しかし、いくつかの回は、私たちはそうMongoDBのアプリケーションが文書を関連付けるための2つの方法のいずれかを使用して関連付ける必要があります。次に、アプリケーションは2番目のクエリを実行して関連するデータを返します。これらの参照は、ほとんどの使用例では単純で十分です。

  2. DBREFSは、最初の文書の_idフィールドの値が、コレクション名、および、必要に応じて、そのデータベース名を使用して別の文書から参照されています。これらの名前を含めることで、複数のコレクションにあるドキュメントを単一のコレクションからのドキュメントに簡単にリンクすることができます。DBはオブジェクトを読み取るために追加のクエリを作成する必要があるため、それでも手動で参照を処理する必要があります。 DBRefを参照している間だけ、存在するかどうかがわかります。参照の対象がそれ以上存在しない場合、DBはすべての文書を参照して参照を探して削除しません。しかし、私は本を削除した後にすべての参照を削除すると、コレクションごとに単一のクエリが必要になると思います。

詳細については、Database Referencesを参照してください。

このタスクをどのように解決できますか?

明らかに、MongoDBはリレーショナルではありません。標準的な「標準形式」はありません。格納するデータと実行するクエリに合わせてデータベースをモデル化する必要があります。 EX-

student 
{ 
    _id: ObjectId(...), 
    name: 'Jane', 
    courses: [ 
    { course: 'bio101', mark: 85 }, 
    { course: 'chem101', mark: 89 } 
    ] 
} 

course 
{ 
    _id: 'bio101', 
    name: 'Biology 101', 
    description: 'Introduction to biology' 
} 

については はMongoDBのはNoSQLのではありませんので、何も加わり、この

student 
{ 
    _id: ObjectId(...), 
    name: 'Jane', 
    courses: [ 
    { 
     name: 'Biology 101', 
     mark: 85, 
     id:bio101 
    }, 
    ] 
} 
+0

RDBSからnosqlへのデータの一貫性については尋ねませんが、mongoDbのデータの整合性については、例えば:私は2つのテーブルuserとtaskを持っています。両方ともuserIdフィールドを共通にしています。タスクテーブルに新しいエントリを追加すると、useridがユーザテーブルに存在するかどうかを確認する必要があります。これは値など – rahul

+0

外部キーを更新し、制約を追加するなどの要件他人の一つであり、いかなる方法に関連していないジョイン。彼が必要とする外来のキーであり、結合ではありません。 –

+0

@SergioTulentsevユーザー(rahul)の検査を見てください。それは外来キーを使用するようです。 –

2
  • に解決するようにしてください。それが有効なユーザーを持っているかどうかをタスク・ドキュメントを追加する前に、アプリケーション内

    • チェック:
    • データは、したがって、BSONドキュメントおよび外部キー制約データの整合性を確保し

    ステップ

  • として格納されています。
+1

ジョインはどこの質問にも言及されていません。 –

5

最終的にはあなたは嫌われています。それは一般、特に外部キーでの関係を欠いていますので、ない方法は、このようなシナリオで保証データの整合性に(MongoDBの中に)ありません。そして、アプリケーションレベルのチェックを構築する上での重要な点はありません。彼らがどんなに精巧であっても、彼らはまだ失敗することができます(したがって「保証はありません」)。

したがって、埋め込み(関連するデータが常に文書の右側にあるように)するか、一貫性のあるデータの希望を放棄します。

関連する問題