Người dùng user
có thể có nhiều projects
(và một dự án chỉ được liên kết với một người dùng). Đây là một-nhiều mối quan hệ.
Mọi user
nên lưu trữ danh sách các projects
của anh ấy / cô ấy . Ví dụ:
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. } },
...
]
Lưu ý rằng mỗi projects
là một tài liệu con (đối tượng hoặc tài liệu nhúng) trong các dự án user
mảng. Một projects
có các chi tiết liên quan như, projectId
, projectName
, v.v ..
Tôi nghĩ, chỉ nên có một bộ sưu tập được gọi là user_projects
. Giả sử rằng:(i) một user
có thể có 0 đến 100 dự án và (ii) một projects
chi tiết của không quá lớn.
Đây là một mô hình nhúng bên 'nhiều' của mối quan hệ 1-N vào bên 'một'. Đây là cách được khuyến nghị, khử chuẩn hóa dữ liệu. Điều này có lợi thế là các truy vấn hiệu quả và nhanh chóng. Điều này đơn giản hóa các giao dịch, vì việc ghi (chèn, cập nhật và xóa) sẽ trở thành nguyên tử với một thao tác duy nhất đối với một tài liệu trong cùng một bộ sưu tập.
Bạn sẽ sử dụng user
id
hoặc name
(với một chỉ mục duy nhất) để truy xuất một tài liệu và nó sẽ được truy vấn rất nhanh. Bạn có thể có chỉ mục trên các dự án user
mảng (chỉ mục trên các trường mảng được gọi là Chỉ mục nhiều khóa ) - trên các lĩnh vực của dự án. Ví dụ:lập chỉ mục trên projectId
hoặc / và projectName
có lý.
Bạn có thể nhận tất cả các dự án cho một người dùng - đó là một truy vấn đơn giản bằng cách sử dụng user
id
/ name
. Truy vấn chiếu cho phép thông tin nào liên quan đến projects
được hiển thị. Bạn có thể sử dụng find
hoặc aggregate
để tạo truy vấn.Bạn có thể truy vấn một projects
cụ thể cho người dùng user
, sử dụng projectId
hoặc projectName
. Vì có chỉ mục trên user
và projects
, đây sẽ là một truy vấn hiệu quả.
Vì vậy, đề xuất của tôi là nên có một bộ sưu tập duy nhất, user_projects
, với user
thông tin của và projects
thông tin được nhúng trong đó.