2011-11-21 25 views
6

Tôi có một câu hỏi cơ bản về nơi tôi nên nhúng một bộ sưu tập những người theo dõi/theo dõi trong một db mongo. Nó có ý nghĩa để có một bộ sưu tập nhúng sau đây trong một đối tượng người dùng, nhưng nó cũng có ý nghĩa để cũng nhúng bộ sưu tập những người theo dõi converse không? Điều đó sẽ có nghĩa là tôi sẽ phải cập nhật và nhúng trong hồ sơ thông tin về cả:thiết kế db mongo của các mục sau đây và nguồn cấp dữ liệu, tôi nên nhúng ở đâu?

  1. sau danh sách nhúng trong đi theo
  2. Và những người theo danh sách nhúng của followee

Tôi có thể' t đảm bảo nguyên tử trên đó trừ khi tôi cũng bằng cách nào đó giữ một giao dịch hoặc cập nhật trạng thái ở đâu đó. Có đáng giá nó nhúng trong cả hai thực thể hoặc tôi chỉ cần cập nhật # 1, nhúng sau trong hồ sơ của người theo dõi và, đặt một chỉ mục trên nó để tôi có thể truy vấn cho người theo dõi trên tất cả các cấu hình? Hiệu suất có ảnh hưởng đến quá nhiều không?

Đây có phải là ứng viên cho bộ sưu tập không được nhúng không? Tôi có nên chỉ có một bộ sưu tập các cạnh mà tôi lưu trữ sau trong bộ sưu tập của riêng mình với followerid và followbyId?

Bây giờ, nếu tôi cũng phải cập nhật nguồn cấp dữ liệu cho cả người dùng khi họ được theo dõi hoặc theo dõi, tôi nên tổ chức điều đó như thế nào? Đối với trường hợp sử dụng, người dùng sẽ thấy những người họ đang theo dõi khi xem nguồn cấp dữ liệu của họ, điều này xảy ra khá thường xuyên và cũng xem những người theo dõi tiểu sử khi họ xem chi tiết tiểu sử của bất kỳ ai, điều này cũng thường xuyên xảy ra nhưng không hoàn toàn nhiều như trường hợp đầu tiên. Trong cả hai trường hợp, tổng số người theo dõi và người theo dõi sẽ hiển thị trên mọi trang tiểu sử.

Trả lời

11

Nói chung, đó là một ý tưởng tồi để nhúng sau/sau theo mối quan hệ thành các tài liệu của người dùng, vì nhiều lý do:

(1) có một giới hạn kích thước tài liệu tối đa 16MB, và đó là chính đáng rằng một phổ biến người dùng trang web được đăng ký tốt có thể kết thúc với hàng trăm nghìn người theo dõi, sẽ tiếp cận kích thước tài liệu tối đa,

(2) mối quan hệ người theo dõi thường xuyên thay đổi và trường hợp người dùng nhận được nhiều người theo dõi vào việc tăng trưởng tài liệu lặp lại nếu bạn đang nhúng người theo dõi. Sự tăng trưởng tài liệu thường xuyên sẽ cản trở đáng kể hiệu suất MongoDB, và vì thế nên tránh (sự tăng trưởng tài liệu không thường xuyên, đặc biệt là các tài liệu có xu hướng đạt đến kích thước cuối cùng ổn định, ít bị phạt hiệu suất hơn). Vì vậy, vâng, tốt nhất là chia nhỏ mối quan hệ sau/theo sau thành một bộ sưu tập riêng biệt của từng bản ghi, mỗi trường có hai trường, ví dụ: {_id:, oid:}, với chỉ mục trên _id (cho "người tôi đang theo dõi? "truy vấn) và oid (cho" người theo dõi tôi? "truy vấn). Bất kỳ thay đổi trạng thái riêng lẻ nào được mô hình hóa bằng cách thêm hoặc xóa tài liệu đơn lẻ, mặc dù nếu bạn cũng hiển thị những thứ như số người theo dõi, bạn có thể giữ các bộ đếm riêng biệt mà bạn cập nhật sau khi chèn/xóa cạnh.

(Tất nhiên, điều này cho thấy yêu cầu kinh doanh của bạn cho phép bạn linh hoạt về chi tiết nhất quán: nói chung, nếu mã hiển thị của bạn cho người dùng là 304 người theo dõi và sau đó tiến hành liệt kê họ, chỉ người dùng khó tính nhất mới kiểm tra Nếu yêu cầu kinh doanh đòi hỏi sự nhất quán tuyệt đối, bạn sẽ cần một cơ sở dữ liệu tách riêng các giao dịch cho bạn, nếu không bạn sẽ phải tự tính số như một phần hiển thị tất cả các nhận dạng người dùng.)

+1

Mặc dù rất quan hệ trong tự nhiên, tôi hoàn toàn đồng ý với cách giải thích của bạn.Đây là một trong những nơi mà các mối quan hệ có ý nghĩa hoàn hảo, và bạn không kết thúc với các hình phạt về hiệu suất theo cách này. –

+0

điều này cũng sẽ áp dụng cho "thích" không? Ví dụ bỏ phiếu trên trang web mongo nhúng các lượt thích trong tài liệu nhưng có vẻ như cùng một dòng lý luận có thể được thực hiện cho các lượt thích cũng như sau. – MonkeyBonkey

+0

@MonkeyBonkey - cách tiếp cận này có thể được sử dụng cho "thích" là tốt, nhưng bạn rất có thể sẽ chỉ muốn 1 trong số các chỉ mục. Lợi thế của việc nhúng nó cho một kịch bản "thích" là bạn có thể duy trì một số lượng chính xác "các số" bằng cách sử dụng toán tử $ inc. Ngoài ra, điều này phụ thuộc vào trang web của khóa học nhưng # người thích một bài đăng không thể đạt đến cấp độ tương tự như # người theo dõi cho người dùng có lưu lượng truy cập cao, vì vậy hiệu suất tồi tệ nhất có thể ít quan trọng hơn ở đó. – mpobrien

Các vấn đề liên quan