2017-11-30 9 views
0

私は映画のためのデータベースを作っています。私はもともと映画の中にこのような俳優を埋め込むつもりだった。2つのコレクションをリンクする方法に関するMongodbの設計アドバイス

{ 
    title : 'movie', 
    actors : [ 
    { 
     name: 'actor', 
     DOB : '1/1/1', 
    }, 
    { 
     name: 'actor2', 
     DOB : '1/1/1', 
    } 
    ], 
} 

私はすぐにこれが悪い決断だと判断しました。ですから、私の次のアイデアは、別々のアクターのコレクションを作成し、このような映画のドキュメンタにアクターIDを埋め込むことでした。

{ 
    title : 'movie', 
    actors : [ 
    'actorid1', 
    'actorid2', 
    ], 
} 

この実装は悪いですか?私は俳優がいたすべての映画を追跡したいと思ったら、俳優のドキュメンテーションの映画のリストを作る必要があるように思えます。2つを関連付けるためのリンクテーブルを作成する方が良いでしょうか? NoSQLデータベースの関連するSQL構造を避けるべきかどうかはわかりませんでした。モンゴブではテーブルをめちゃくちゃにするのか?

+0

最初に最も頻繁にアクセスする必要があるデータは、i。 e。あなたのデータに対して最も頻繁に要求が行われます。それに応じて、別々のコレクションを必要とするのか、何に組み込むのかを決定します。 –

+0

私は、映画や俳優に平等にアクセスし、互いにどのように関係しているかを計画しています。たとえば、私は "腐ったトマトからトップ10の評価を受けた映画のすべての俳優を取得する"またはその逆を行うことができるようにしたいと考えています。 これは、デザインと私は、アクターと映画をリンクするコレクションを作成するのが最善の方法だと思います。私の質問です:これはNoSQLのDBのに眉をひそめですか? – user3736114

+0

はい、そうです。少なくともMongoDBでは。リンクコレクションでは、_JOIN_が存在しないため、関連するエンティティIDを含む配列を持つドキュメントではなく、クエリDBをさらに必要とします。 –

答えて

1

一般に、MongoDBではリンクコレクションを使用してデータにアクセスするための結合(リレーショナルデータモデル)が可能です。しかし、それは単にモデルデータに異なるアプローチを使用します。サブ文書と配列を含むBSON文書(バイナリJSON)のデータを表すことは、多くの場合、コレクションと結合を冗長にします。 Using the document model, embedded sub-documents and arrays effectively pre-JOIN data by aggregating related fields within a single data structure。さらに、ドキュメントには、リレーショナルデータモデルに比べていくつかの利点があります。第1に、複雑性を増し、開発を遅らせるオブジェクトモデルにリレーショナルモデルをマップする必要はありません。第2に、文書がメモリまたはディスクであるかどうかにかかわらず、1つの物理的な場所から文書全体を読み取ることができ、データベースが複数のノードに分散されている場合、クロスノードJOINsを排除できるため、文書のパフォーマンスとスケーラビリティが向上します。

私は「腐敗したトマトからトップ10の映画のすべての俳優を取得する」またはその逆を「これらの俳優から最高評価の映画を入手する」が映画データベースの最も頻繁なクエリではないと仮定します。 私の意見では、は、主演の俳優や映画のリストを持つ俳優と一緒に映画を取得しています。情報を集約する俳優やその逆に映画から両方向の参照があります

{ 
    title : 'movie', 
    actors : [ 
    { 
     _id: 'actor_id1', 
     name: 'actor1' 
    }, 
    { 
     _id: 'actor_id'2, 
     name: 'actor2' 
    } 
    ], 
    plot: '...', 
    reviews: [...], 
    ... 
} 

{ 
    name : 'actor1', 
    movies : [ 
    { 
    _id: 'movie_id1', 
    name: "movie1' 
    }, 
    { 
    _id: 'movie_id2', 
    name: "movie2' 
    } 
], 
biography: '...', 
pictures: [...], 
... 

}

:それから私は、次のスキーマを考えwhould。また、対応する_idと一緒に俳優と映画の名前があり、このデータを1回のリクエストで取得します。映画の名前だけでなく、俳優の名前も頻繁に変わるので、一貫性を失う可能性は低いです。

+0

ああ、ありがとう。これは私が探していた種類の情報です。データの冗長性はmongodbの考慮事項ではありませんか?スキーマには冗長性が伴うようです。 – user3736114

+1

データの不一致の機会が開かれるため、常にそうです。しかし、あなたはおそらく俳優や映画の名前を変更するつもりはないので、この場合、シンプルさとパフォーマンスのためのトレードオフは許容されます。あなたがそうだった場合は、両方のコレクションで名前が変更されていることを確認する必要があります。 –

関連する問題