Ngược lại, giải pháp 1 và 2 là cách tốt nhất của bạn. Giải pháp 3 có thể được xem xét khi tần suất cập nhật / tạo là rất ít so với tần suất đọc của các dự án và người dùng vì mặc dù để cập nhật / tạo, cần phải có hai truy vấn, tính dễ đọc sẽ bù đắp cho điều đó.
Để lựa chọn giữa giải pháp 1 và 2, bạn cần xem xét các tần số đọc. Bạn sẽ cần các dự án của một người dùng hoặc sử dụng một dự án thường xuyên hơn và chọn theo điều đó. Nếu bạn cảm thấy cả hai đều có tần suất tương đối giống nhau, tốt hơn nên giữ cho đối tượng người dùng càng ít nhóm càng tốt. Dù bạn chọn tùy chọn nào, hãy cân nhắc giữ một index
trên mảng lưu trữ _id
s (của các dự án hoặc người dùng).
Đối với người yêu cũ.
userSchema = new Schema(
{//otherstuff
project_ids: [{type: Schema.Types.ObjectId, ref: 'Project'}})
...
})
userSchema.index({'project_ids':1})
hoặc
projectSchema = new Schema(
{//otherstuff
user_ids: [{type: Schema.Types.ObjectId, ref: 'User'}})
...
})
projectSchema.index({'user_ids':1})
Giữ chỉ mục trên mảng _id
sẽ cải thiện đáng kể tốc độ truy vấn của bạn ở khía cạnh mà bạn lo sợ sẽ có chi phí đáng kể.
Nhưng hãy giữ lại index
chỉ khi mối quan hệ này là một mối quan hệ quan trọng với rất nhiều truy vấn đang diễn ra. Nếu đây chỉ là một tính năng phụ của dự án của bạn, bạn có thể thực hiện without
một chỉ mục nữa.
Nếu người dùng có thể làm nhiều việc và có nhiều mối quan hệ, bạn sẽ cần đối tượng người dùng đó liên tục trong toàn bộ ứng dụng của mình, vì vậy nếu ứng dụng của bạn không phải là dự án cụ thể, tốt hơn là không đặt id dự án trong lược đồ người dùng . Nhưng vì chúng tôi chỉ đặt id, nên dù sao thì nó cũng không quá tốn kém. Không cần phải lo lắng về điều đó.
Chỉ mục Reg trên cả hai mảng:Tất nhiên là có. Nhưng khi bạn sử dụng giải pháp 3, bạn hoàn toàn không cần chỉ mục vì bạn sẽ không thực hiện truy vấn để lấy danh sách các dự án của một người dùng hoặc danh sách người dùng trong một dự án. Giải pháp 3 làm cho việc đọc rất dễ dàng nhưng viết hơi rườm rà. Nhưng như bạn đã đề cập rằng trường hợp sử dụng của bạn liên quan đến reading>>writing
, hãy sử dụng giải pháp 3 nhưng luôn có nguy cơ về sự không nhất quán của dữ liệu mà bạn cần phải lưu ý.
Lập chỉ mục chỉ làm cho mọi thứ nhanh hơn. Xem qua các tài liệu và thực hiện một chút về googling. Không có gì lạ mắt. Truy vấn trên các mảng được lập chỉ mục hiệu quả hơn các mảng bình thường. Đối với người yêu cũ. Hãy để chúng tôi giả sử bạn sử dụng giải pháp 2. Lưu trữ id dự án trong trường project_ids.
Bạn có thể nhận được các dự án của người dùng một cách dễ dàng. Điều này là thẳng về phía trước.
Nhưng để có được người dùng của dự án1. Bạn cần một truy vấn như thế này.
User.find({project_ids:project._id},function(err,docs){
//here docs will be the list of the users of project1
})
//The above query might be slow if the user base is large.
//But it can be improved vastly by indexing the project_ids field in the User schema.
Tương tự cho giải pháp 1. Mỗi dự án đều có trường user_ids, hãy giả sử chúng tôi có một người dùng1. Để nhận được các dự án của người dùng, chúng tôi thực hiện truy vấn sau đây
Project.find({user_ids:user1._id},function(err,docs){
//here docs will be the projects of user1
//But it can be improved vastly by indexing the user_ids field in the Project schema.
Nếu bạn đang cân nhắc giải pháp 1 so với giải pháp 2, tôi đoán giải pháp 1 là tốt hơn. Có thể có trường hợp bạn cần người dùng mà không có dự án của anh ta nhưng khả năng yêu cầu dự án không có người dùng là khá thấp. Nhưng nó phụ thuộc vào trường hợp sử dụng chính xác của bạn.