2010-06-10 31 views
22

Là một trong những giải pháp NoSQL phổ biến nhất MongoDB có hầu hết các ưu điểm của phương pháp này. Nhưng một vấn đề mà tôi vẫn đang gặp phải là phản ánh mối quan hệ đối tượng trong kho dữ liệu NoSQL, cụ thể như thế nào - MongoDB.Mô phỏng quan hệ trong MongoDB

Ví dụ: hãy xem xét một mô hình dữ liệu đơn giản: Người dùng, Bài đăng và Nhận xét. Rõ ràng với tôi rằng các bình luận không có giá trị riêng của chúng và do đó trở thành các đối tượng nhúng cho Bài viết. Nhưng khi nói đến người dùng - điều đó trở nên phức tạp bởi vì Người dùng là một thực thể, không phải cùng với Bài đăng. Bây giờ trong trường hợp tôi cần liệt kê các bài viết với tên đầy đủ của người dùng và liên kết đến các hồ sơ trên một trang web, tôi sẽ cần phải có một danh sách các bài viết và thông tin về các tác giả bài viết (tên và id ít nhất).

tôi thấy 2 giải pháp khả thi ở đây:

  1. De-chuẩn hóa dữ liệu trong một cách mà mỗi mục bài chứa ID tác giả của nó và ghi rõ họ tên (và bất kỳ người sử dụng các thuộc tính khác tôi có thể cần khi liệt kê bài viết). Bằng cách này tôi sẽ làm cho truy vấn cho các dữ liệu thực sự đơn giản nhưng khi người dùng cập nhật hồ sơ của mình, tôi sẽ cần phải cập nhật tất cả các bài viết của người dùng là tốt. Nhưng sau đó tôi cũng cần lưu trữ các thuộc tính người dùng trong các đối tượng bình luận có nghĩa là cập nhật hồ sơ người dùng về cơ bản yêu cầu tôi cập nhật tất cả các bài đăng có ít nhất một nhận xét của người dùng trừ khi tôi muốn lưu trữ nhận xét trong một bộ sưu tập riêng biệt.
  2. Chỉ lưu trữ ID người dùng trong đối tượng bài đăng và chạy 2 truy vấn: một để nhận danh sách bài đăng và một danh sách bài đăng khác để có danh sách người dùng có id người dùng nằm trong danh sách các tác giả bài đăng. Điều này yêu cầu 2 truy vấn và xử lý thêm trong mã ứng dụng của tôi để ánh xạ người dùng tới bài đăng.

Tôi chắc chắn tôi không phải là người đầu tiên đối mặt với vấn đề này nhưng tiếc là tôi chưa tìm thấy bất kỳ phương pháp hay nhất nào về chủ đề này cho đến nay. Ý kiến?

+0

Bạn đã đi với lược đồ phương pháp nào? giải pháp 1? hoặc giải pháp 2? – koeder

+0

Nó được mô tả khá tốt trong câu trả lời của TTT - tùy thuộc vào những gì bạn cần từ dữ liệu của bạn, bạn cần phải chọn. Tôi có cả hai cách tiếp cận được triển khai trong ứng dụng của mình. –

+0

chỉ tò mò, làm thế nào để bạn thích mongodb? Bạn đã sử dụng Mongo như thế nào? – koeder

Trả lời

14

Cả hai đều là các giải pháp hợp lệ, lợi thế của giải pháp 1 là bạn có thể hiển thị một trang như thế này chỉ lấy một tài liệu từ db. Người dùng không cập nhật hồ sơ của họ thường xuyên và bạn có thể cập nhật tất cả bài đăng và nhận xét được nhúng không đồng bộ sau khi hồ sơ người dùng bị thay đổi. Bạn có thể lập chỉ mục các bài đăng và nhận xét được nhúng trên userid để cập nhật sẽ nhanh chóng. Việc cập nhật trong mongodb rất nhanh vì mongodb thực hiện cập nhật tại chỗ và bạn không thể khôi phục hoặc cam kết để mongodb không phải ghi lại các thay đổi.

Tuy nhiên, người dùng trên các trang web như stackoverflow cũng có danh tiếng và danh tiếng này thay đổi nhiều hơn hồ sơ của họ.

Giải pháp 2 yêu cầu truy xuất nhiều tài liệu hơn trên mỗi trang, tuy nhiên bạn có thể sử dụng toán tử $ in với danh sách userid (userid of comment của userid) vì vậy bạn chỉ cần hai "selects statements".

1

tôi phải đối mặt với một vấn đề tương tự và đây là cách tôi giải quyết nó:

(Khi tôi giải quyết vấn đề này, động lực lái xe của tôi là để tránh tham gia)

sử dụng 2 bộ sưu tập riêng biệt: một cho người sử dụng và một cho POSTS. Lưu trữ đối tượng người dùng cùng với bài đăng trong bộ sưu tập bài đăng. Không cập nhật bộ sưu tập bài viết khi đối tượng người dùng bị thay đổi. duy trì thông tin người dùng là bộ sưu tập USERS. Chắc chắn dữ liệu bài đăng sẽ có chứa thông tin người dùng cũ nhưng tần suất người dùng thay đổi tiểu sử của họ.

Nếu bạn phải hiển thị thông tin người dùng mới nhất tuyệt đối cùng với mỗi bài đăng, hãy truy xuất thông tin người dùng từ bộ nhớ cache.

Hy vọng điều này phù hợp với bạn.Giải pháp của tôi vẫn đang được phát triển nên tôi không có kết quả thử tải để chia sẻ với bạn.

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