1

NoSQLまず、私は&が大好きだということを言いたいのですがMongoDB、そのschema-less側面には大きな懸念があります。

2つのテーブルがあるとしましょう。従業員映画

そして...私は時々間違ったテーブルにオブジェクトを保存したい非常に愚かなdata layer/を持っています。framework

ある日、 aMovieがテーブルに保存されEmployeesます。このような:

> use mongoTests;
switched to db mongoTests
> db.employees.insert({ name : "Max Power", sex : "Male" });
> db.employees.find();
{ "_id" : ObjectId("4fb25ce6420141116081ae57"), "name" : "Max Power", "sex" : "Male" }
> db.employees.insert({ title : "Fight Club", actors : [{ name : "Brad Pitt" }, { name : "Edward Norton" }]});
> db.employees.find();
{ "_id" : ObjectId("4fb25ce6420141116081ae57"), "name" : "Max Power", "sex" : "Male" }
{ "_id" : ObjectId("4fb25db834a31eb59101235b"), "title" : "Fight Club", "actors" : [ { "name" : "Brad Pitt" }, { "name" : "Edward Norton" } ] }

これは非常に間違っています。

コンテキストを切り替えて、 MoviesCreditCardsについて考えてみましょう(何らかの理由で、このコンテキストでは、クレジット カードは DB 内にクリア テキストで格納されます)。これは非常に間違っていますか?

  1. オブジェクト構造を使用しようとして、別のまったく未知の構造を受け取るため、コードはおそらく爆発するでしょう。

  2. さらに悪いことに、コードは実際に機能し、Web ストアの訪問者は実際に「Rent a movie」リストにクレジット カード情報を表示します。

このような脅威が発生するのを防ぐ組み込みの機能はありますか? 一部のテーブルに対してのみスキーマが尊重されるように「強制」する方法はありますか?

または、MongoDB を強制的にスキーマを必須にする方法はありますか? (テーブルなどに新しいフィールドを作成することはできません)

編集: 私がトローリングだと思っている人のために、私はそうではありません。これは私と私のチームにとって重要な質問です。なぜなら、これは NoSQL を使用するかどうかの大きな決断だからです。

ありがとう、良い一日を。

4

1 に答える 1

2

スキーマレスの側面は、主要な利点の 1 つです。

スキーマを持つ DB は、この種の問題を完全に取り除くわけではありません。たとえば、RDBMS を使用するシステムでは、間違ったフィールド/テーブルに間違ったデータを配置するバグが発生する可能性があります。

私見、より大きな懸念は、その種のバグがどのようにして開発、テスト、および本番環境に到達したのかということです!

そうは言っても、コレクション内のドキュメントの「スキーマ」をチェックするプロセスを設定できます (たとえば、新しく追加されたドキュメントを見て、そこに表示されると予想されるフィールドがあるかどうかをチェックします) - 調査のためにフラグを立てます。ここにそのようなツール(node.js)があります(私はそれを使用したことがないと思います):

http://dhendo.github.com/node-mongodb-schema-validator/

編集:
将来この質問を見つけた人のために、私のコメントのリンクが見落とされないように、この種のジラ アイテムがここにあります: http://jira.mongodb.org/browse/SERVER-3536

于 2012-05-15T13:58:07.120 に答える