2012-02-10 41 views
5

Tôi hiện đang cố gắng triển khai các tương tác người dùng giống như Tumblr như reblog, theo dõi, người theo dõi, nhận xét, bài đăng trên blog của những người tôi hiện đang theo dõi… Ngoài ra còn có yêu cầu hiển thị hoạt động cho mỗi bài đăng trên blog.Cách hiệu quả để tạo mối quan hệ với cơ sở dữ liệu NoSQL

Tôi bị kẹt với việc tạo giản đồ thích hợp cho cơ sở dữ liệu. Có một số cách để đạt được loại chức năng này (xác định cấu trúc dữ liệu được nhúng như bài đăng trên blog và nhận xét, tạo tài liệu hoạt động cho từng hành động, v.v.) nhưng hiện tại tôi không thể quyết định cách nào là tốt nhất về hiệu suất và khả năng mở rộng.

Ví dụ: hãy xem xét việc triển khai những người tôi theo dõi. Đây là mẫu Tài liệu người dùng.

User = { id: Integer, 
     username: String, 
     following: Array of Users, 
     followers: Array of Users, 
     } 

Điều này có vẻ tầm thường. Tôi có thể quản lý trường sau cho mỗi hành động của người dùng (theo dõi/hủy theo dõi) nhưng điều gì xảy ra nếu người dùng tôi hiện đang theo dõi bị xóa. Có hiệu quả không khi cập nhật tất cả hồ sơ Người dùng theo dõi người dùng đã bị xóa.

Một vấn đề khác là tạo chế độ xem bài đăng trên blog từ những người tôi theo dõi.

Post = { id: Integer, 
      author: User, 
      body: Text, 
     } 

Vì vậy, nó có hiệu quả truy vấn các bài đăng mới nhất như;

db.posts.find({ author: { $in : me.followers} }) 

Trả lời

0

Một cách tiếp cận hoạt động được gọi là "Lược đồ sao". Nếu bạn tìm kiếm trên web hoặc wikipedia thì bạn sẽ tìm thấy rất nhiều thông tin.

3

Dường như (với tôi) bạn đang cố gắng sử dụng một kho dữ liệu duy nhất (trong trường hợp này là một cơ sở dữ liệu NoSQL theo định hướng tài liệu) để đáp ứng (ít nhất) hai yêu cầu khác nhau. Điều đầu tiên bạn dường như đang cố gắng làm là lưu trữ dữ liệu trong một cửa hàng hướng tài liệu. Tôi sẽ giả định rằng bạn có lý do chính đáng để làm điều này.

Điều thứ hai bạn dường như đang cố gắng làm là thiết lập mối quan hệ giữa các tài liệu bạn đang lưu trữ. Ví dụ của bạn hiển thị mối quan hệ FOLLOWS. Tôi khuyên bạn nên xử lý điều này như một yêu cầu khác từ việc lưu trữ dữ liệu trong cơ sở dữ liệu NoSQL theo định hướng tài liệu và xem xét lưu trữ các mối quan hệ trong một cơ sở dữ liệu NoSQL theo định hướng đồ thị như Neo4j. Bằng cách này, các thực thể của bạn có thể được lưu trữ trong kho lưu trữ tài liệu và các mối quan hệ trong cửa hàng đồ thị bằng cách sử dụng các ID tài liệu.

Kinh nghiệm của tôi là khó có được một cơ sở dữ liệu NoSQL duy nhất để đáp ứng tất cả các nhu cầu chức năng và phi chức năng của ứng dụng có kích thước trung bình đến lớn. Ví dụ, ứng dụng mới nhất mà tôi đang sử dụng trên MongoDB, Redis và Neo4j bên cạnh một RDBMS. Tôi đã dành rất nhiều thời gian thử nghiệm với công nghệ và giải quyết trên sự kết hợp này. Tôi đã cam kết sử dụng Spring 3, cùng với dự án Spring Data và cho đến nay trải nghiệm của tôi đã rất tuyệt vời.

+0

Cảm ơn câu trả lời tốt bụng của bạn. Tôi thực sự sử dụng MongoDB phù hợp với Node.js rất tốt. Tôi không muốn sử dụng bất kỳ công nghệ nào khác (vì tôi phải học nó và xử lý các vấn đề khác) miễn là nó có thể được triển khai bằng cách sử dụng MongoDB một cách hiệu quả. –

+0

Tôi chắc chắn có thể thấy sự cám dỗ để tiếp tục cố gắng sử dụng MongoDB để duy trì các mối quan hệ tài liệu lo sợ rằng một công nghệ khác sẽ tạo ra nhiều phức tạp hơn. Tuy nhiên, đây sẽ là một giải pháp không thể đánh giá theo quan điểm của tôi nói chung, ngoại trừ nơi ứng dụng được đề cập là rất nhỏ và sẽ luôn được duy trì bởi một nhà phát triển duy nhất. Vì số lượng nhà phát triển trong nhóm sẽ tăng lên, mỗi người sẽ phải hiểu những tác động của việc cập nhật và xóa tài liệu trên các mối quan hệ tài liệu. Về lâu dài nó sẽ chỉ gây ra nhiều sai lầm và phức tạp hơn. – manish

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