ユーザー
多くのプロジェクト
を持つことができます (プロジェクトは1人のユーザーにのみ関連付けられます)。これは1対多です 関係。
すべてのユーザー
彼/彼女のプロジェクト
のリストを保存する必要があります 。例:
user:
id: <some value>,
name: <some value>,
email: <some value>,
projects: [
{ projectId: <some value>, projectName: <...>, projectDescription: <....>, otherInfo: { fld1: <...>, fld2: <...>, etc. } },
{ projectId: <some value>, projectName: <...>, projectDescription: <....>, otherInfo: { fld1: <...>, fld2: <...>, etc. } },
...
]
各プロジェクト
に注意してください projects
内のサブドキュメント(オブジェクトまたは埋め込みドキュメント)です 配列。 プロジェクト
projectId
などの関連する詳細があります 、 projectName
、など。
コレクションは1つだけあるべきだと思います user_projects
と呼ばれます 。 (i) user
0〜100のプロジェクトがあり、(ii)プロジェクト
の詳細はそれほど大きくありません。
これは、1対Nの関係の「多くの」側を「1つの」側に埋め込むモデルです。これは、データを非正規化するための推奨される方法です。これには、効率的で高速なクエリという利点があります。これにより、同じコレクション内のドキュメントへの1回の操作で書き込み(挿入、更新、削除)がアトミックになるため、トランザクションが簡素化されます。
user
を使用します id
またはname
(一意のインデックスを使用して)ドキュメントを取得します。これは非常に高速なクエリになります。 プロジェクト
にインデックスを付けることができます 配列(配列フィールドのインデックスはマルチキーインデックスと呼ばれます )-プロジェクトのフィールド。たとえば、 projectId
のインデックス または/およびprojectName
理にかなっています。
ユーザーのすべてのプロジェクトを取得できます-user
を使用した簡単なクエリ id
/名前コード> 。クエリプロジェクション
project
に関連する情報を許可します 表示されています。 find
を使用できます またはaggregate
クエリを作成するメソッド。特定のプロジェクト
にクエリを実行できます。 user
の場合 、 projectId
を使用 またはprojectName
。 user
にインデックスがあるので およびproject
フィールドの場合、これは効率的なクエリになります。
したがって、私の推奨事項は、単一のコレクション user_projects
を持つことです。 、 user
の情報とプロジェクト
そこに埋め込まれた情報。