sql >> データベース >  >> NoSQL >> MongoDB

(リレーショナルテーブルの代わりに)MongoDBでの多対多の関係の設計

    これは、多対多の関係を持つデータを持つ場合です。データベースには数千人の学生と数百のコースがあると思います。

    まず、coursesと呼ばれるサブドキュメントの配列として、各学生にコースの詳細が埋め込まれた次のデザインを使用できます。 。

    - students collection
    id:
    name:
    courses: [ { id: 1, name: },  { id: 5, name: }, ... ]
    
    - courses collection
    id:
    name:
    description:
    

    コースIDと名前は両方のコレクションに保存されていることに注意してください。これはデータの重複です。複製された詳細は頻繁に変更されない(またはまったく変更されない可能性がある)ため、これは問題ありません。

    学生が登録されているすべてのコースをクエリします。例:db.students.find( { name: "John" } ) 。これにより、名前が一致する1つの学生ドキュメントとすべてのコース(配列フィールド)が返されます。 db.collection.find を参照してください 。

    特定のコースに登録されているすべての学生にクエリを実行します:db.students.find( { "courses.name": "Java Programming" } ) 。これにより、「javaプログラミング」の基準に一致するコース名を持つすべての学生ドキュメントが返されます。 埋め込みドキュメントの配列のクエリ を参照してください。 。

    さらに、プロジェクションを使用できます 除外して含める 結果からのフィールド。

    注:

    • コースの代わりに、コースコレクション内に学生情報を埋め込むことができます。クエリは上記のクエリと似ていますが、コースコレクションにクエリを実行します。ユースケースによって異なります。
    • 学生コレクションのcourses配列にコースIDフィールドを保存するだけです。これは、コース名フィールドが頻繁に変更される場合です。クエリでは、集計 $lookup が使用されます。 (「参加」操作)コースを取得し、コースコレクションから取得します。
    • データモデルの設計 に関する情報 ドキュメントベースのMongoDBデータの場合。



    1. PostgreSQLからMongoDBにデータを移行する

    2. サブドキュメントの配列をフィルタリングする方法は?

    3. mongo3.4.1に単純な読み取り/書き込みユーザーを追加します

    4. MongoDBのaggregate/group/sumクエリがpymongoクエリに変換されました