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

次の多対多の関係をMongoDBでどのようにモデル化する必要がありますか?

    ここにいくつかの考慮事項があります。結局、それはあなたの要件に依存します:

    1. 評価はオプションですよね?

      もしそうなら、必要な機能(教師/生徒の関連付けを保存する)と便利な機能を組み合わせるかどうかを自問してください。便利な機能を実装するコードが、最も重要なコレクションに書き込まれるようになりました。 コード内の関心の分離を改善できると思います 別のデータベーススキーマを使用します。

    2. その他の機能が必要ですか ?

      生徒に与えた評価のリスト、生徒が教師に与えた平均評価を提供し、時間の経過に伴う評価の変化を示したいとします。これは、埋め込まれたドキュメントでは非常に厄介になります。 埋め込まれたドキュメントは柔軟性が低くなります

    3. 最高の読み取りパフォーマンスが必要な場合は、より多くのデータを非正規化する必要があります

      埋め込まれたドキュメントに固執したい場合は、より多くのデータをコピーすることをお勧めします。生徒の名前を確認できる、教師ごとの評価の概要があるとします。オブジェクトを埋め込むと便利です

      { studentId : ObjectId, 
        rating: string, 
        studentName: string, 
        created: dateTime }
      

    別の方法として、検討してください

    TeacherRating {
        StudentId: id
        TeacherId: id
        Rating: number
        Created: DateTime
    }
    

    教師/生徒の関連付けは引き続き教師オブジェクトに保存されますが、評価は別のコレクションにあります。教師と生徒の間に関連性が見つからない場合、評価を作成することはできません。

    または

    TeacherStudentClass {
        StudentId: id
        TeacherId: id
        Class: id
        ClassName: string // (denormalized, just an example)
        Rating: number // (optional)
        Created: DateTime
    }
    

    特定の教師のすべての生徒を見つけるには、最初にリンカードキュメントをクエリしてから、$inを実行する必要があります。 生徒に質問する、またはその逆。これはもう1つのクエリですが、柔軟性が大幅に向上します。




    1. Ubuntu16.04にMemcachedをインストールします

    2. アマゾンウェブサービスのDIYクラウドデータベース-新しいホワイトペーパー

    3. MongoDb idの配列を使用して複数のドキュメントを取得するにはどうすればよいですか?

    4. HerokuからMongoLabに接続すると、アプリケーションがタイムアウトします