2011-03-05 13 views
5

GrailsのMongoDBプラグインが関係をどのように処理するのか不思議でした。これをテストするために、私は2つのドメインクラスで非常に簡単なアプリケーションを作っ:MongoDB、Grails、および関係

Authorの二つのフィールドを持っている:MongoDBのを設定した後String titleAuthor author

String firstNameString lastName

Bookのは次の2つのフィールドを持っていますGrails私はAuthorBookを作って、MongoDB対話シェルを使って覗いてみました。私が見つけたのは、関係はリレーショナルデータベースで扱うのと同じ方法で処理されていたということです。他のオブジェクトのIDフィールドへの参照です。質問のために今そう

  1. GORMがこれをやってのけるようにするためには、それが各ドキュメントを取得するために、個別の接続が必要なのですか?
  2. もしそうなら、これはPostgreSQLやMySQLのようなリレーショナルデータベースではうまくいかないでしょうか?
  3. 上記の2つの質問に対する回答が本当に「はい」の場合、MongoDBなどの文書データベースで関係を管理する方が良いでしょうか?私はMongoDBがリレーショナルであるとは考えていませんが、データを複製せずに関係を取り戻す方法がないので、悪夢を更新してしまうことがあります。

編集:私もちょうどGrailsのが私の著者の「ID」プロパティに適切にソートされていないことに気づきました。これはMongoDBの使用と関係がありますか?シェルでは、Grailsによって作成されたすべてのドキュメントの_idプロパティがデータ型がNumberLongであることがわかります。

答えて

3

私はMongoDBのは、リレーショナルすることになっていません実現が、私はそれを悩む必要はありませんデータに

を複製せずに関係を周りに取得する方法を見ていないいくつかのものがあります。 MongoDBは反リレーショナルではなく、ドキュメント指向です。

この場合、書籍と著者は2つのトップレベルオブジェクトです。それらのどちらかを入れ子にすることは合理的ではなく、両方ともそれ自体の中心的な存在です。

1人の著者(N:1)しか持たない各書籍の場合、著者に「参照先」が含まれていることは完全に合理的です。 2つのクエリを実行する必要があります。しかし、それはジョインクエリとはまったく違うのですか?ジョインクエリは、2つのインデックスルックアップと2つのデータルックアップを実行する必要があります。だからあなたはここには何も費やしていない。

複数の著者(M:N)をサポートする各書籍の場合、あなたのニーズに応じてseveral optionsがあります。私は「ないリレーショナル」ようにMongoDBを考えることが好きではありません

、私はそれがクエリ最適化ようにMongoDBを考えるのクリーナーだと思います。

また、私の著者の「id」プロパティでgrailsが適切にソートされていないことに気付きました...

Grailsの著者に直接確認します。実際のObjectId(またはMongoID)の代わりに「文字列」を格納しているように聞こえます。重要ではありませんが、これはバグかもしれません。

1

idプロパティに関しては、デフォルトのGORM実装ではlongを繰り返し使用しないように、ドメインクラスにObjectId idまたはString idの宣言を置くことができるようになりました。クラスのフィールドを宣言するだけで、プラグインが残りの部分を処理します。

関連する問題