プロジェクトに問題があります。関係的に、次のテーブルがあります。
ユーザー
ニックネーム パスワード セッション
** 生徒、教師、および管理者は個人を継承します ** ** 個人はユーザーです **
人
名前 lastName DNI
学生
タラスタッド学期
先生
タラティーチタイプの特産品
管理職
codManagセクションタイプ料金
すべてのテーブルを埋め込んで 1 つのコレクションにまとめる必要がありますか?
感謝。
プロジェクトに問題があります。関係的に、次のテーブルがあります。
ニックネーム パスワード セッション
** 生徒、教師、および管理者は個人を継承します ** ** 個人はユーザーです **
名前 lastName DNI
タラスタッド学期
タラティーチタイプの特産品
codManagセクションタイプ料金
すべてのテーブルを埋め込んで 1 つのコレクションにまとめる必要がありますか?
感謝。
MongoDB のようなドキュメント ストアを使用する場合、スキーマの設計は、アクセス パターンやユーザーによるデータの使用方法に大きく影響されます。これは、データの事前結合/集約の一種です。
編集
一般的な検索が必要なため、type
属性を持つ単一のコレクションに保存することをお勧めします。したがって、2 学期のすべての学生を検索するには、次のクエリを使用します。
db.users.find({"type":"student", "semester":2})
これは、検索条件だけで決定できるものではありません!! あなたの質問に対する簡単な答えは次のとおりです。
場合によります!
オブジェクトをMongoDBに保存する場合、MongoDBのオブジェクトリレーショナルマッピングのすべて(ほぼすべて)の制限があります。
通常、ここには 3 つのアプローチがあります。
初め:
各オブジェクトを独自のコレクションに格納できます。検索の場合は、各ツリーまたはすべてのツリーをまとめて呼び出すことができます。
2 番目: 子と親を別々のコレクションに分けて、ID で参照できます
{"name":"Steph", "semester":2, "personID":123}
これは、ドキュメント ベースの DB であり、2 つのコレクションにまたがるトランザクションをサポートしていないため、mongoDB では最善の方法ではありません。ただし、オブジェクトのサイズが 16MB を超えた場合に役立つ場合があります。
3番目のアプローチは@Pangeaが言及したものです:
すべてのオブジェクトを区別キー付きの 1 つのコレクションに格納します。
{"type":"Student", "name":"Steph", "semester":2}
{"type":"Teacher", "name":"George", "Courses":[101,202,303,404]}
これには、決定を下す前に知っておく必要がある大きな欠点があります。
MongoDB ではあまり問題にならない正規化に加えて、コレクションのサイズとメンテナンスが問題になる可能性があります。
ただし、主な欠点は、これを行うと、オブジェクト仕様が 1 つのコレクションに混在することになり、その結果、これらすべての仕様を伝えることができなくなることです。さらに説明させてください。教師には一意の名前が付けられていますが、生徒には重複した名前を付けることが許可されているとします。コレクション内の名前フィールドを一意にする必要があるかどうかにかかわらず、学生は学生の仕様と矛盾する一意の名前を持つ必要があります。または、名前フィールドを一意にしないでください。教師の仕様と矛盾します!
これら 3 つのアプローチのどれに独自の利点と欠点があります。しかし、一般的に言えば、私は最初のアプローチに行きます! 理解し、維持し、拡張するのが簡単だからです。しかし、それはあなたのソフトウェアです! ソフトウェアの要件と仕様をよりよく理解することができます。どちらが優れているかを判断できるのはあなただけです!