2010-10-01 21 views
9

Những gì tôi cần:Làm một timeline Twitter giống như với MongoDB

Giả sử bạn đang sử dụng MongoDB và bạn có một bộ sưu tập được gọi là users, và mỗi người dùng có một "sau" mảng với người dùng _id s của những người anh ấy theo dõi. Sau đó, bạn có một bộ sưu tập khác statuses, với mỗi trạng thái chứa _id của tác giả của nó. Làm cách nào để hiển thị cho một người dùng nhất định tất cả các trạng thái được thêm bởi những người mà anh ấy đang theo dõi?

gì tôi đã cố gắng:

tôi đặt tất cả những người sử dụng _id s mà người dùng hiện nay đang đi theo trong một mảng (Tôi đang sử dụng PHP), sau đó tôi sử dụng nó để tìm tất cả các trạng thái của những người sử dụng sử dụng $in.

Câu hỏi đặt ra:

Đây có phải là giải pháp tốt nhất?

Trả lời

3

Tôi cũng không thể thấy bất kỳ cách nào khác, tôi đã triển khai điều đó trước đây và không gặp sự cố.

Mở trường hợp của bạn, nó phải được sth như thế này, bạn vượt qua $follower_ids mảng nhất định của người sử dụng như một tham số để hàm của bạn:

$query = array("status_owner_id" => array('$in' => $follower_ids)); 
$cursor = $mongo->yourdb->statuses->find($query); 

Và nếu bạn chỉ số trạng thái (nếu bạn có đủ ram để làm như vậy) trên owner_id bạn sẽ nhận được kết quả rất nhanh.

Hy vọng điều đó sẽ hữu ích, Sinan.

0

gì bạn đã cố gắng là những gì mọi cơ thể suy nghĩ đầu tiên tuy nhiên nó không thực sự dễ dàng để mở rộng quy mô ... Bạn luôn có thể bổ sung thêm các máy chủ hoặc sử dụng sharding vv ... Nếu bạn có triệu người sử dụng và người những người làm theo rất nhiều người giải pháp này sẽ trở nên thực sự khó khăn để thực hiện.

Có một giải pháp khác về cơ bản là chỉ thực hiện tổng hợp khi ai đó đăng trạng thái. Facebook sử dụng ý tưởng này và có thể dễ dàng mở rộng hơn và nếu ai đó theo dõi 25000 người, anh ta sẽ thấy danh sách trạng thái của mình khá nhanh và máy chủ của bạn sẽ không phải "chiến đấu" để truy xuất dữ liệu một cách nhanh chóng.

Bạn sẽ có bộ sưu tập người dùng, mỗi người dùng sẽ có một mảng trạng thái. Giả sử bạn có user1 và user2, và user1 đó theo user2. Khi user2 đẩy trạng thái, trạng thái của anh ta sẽ được lưu trong mảng trạng thái 1 của người dùng VÀ trong mảng trạng thái 2 của người dùng. Bạn sẽ sử dụng nhiều bộ nhớ hơn với mongoDB nghĩa là bộ nhớ nhiều hơn .... Tại Facebook, họ đang sử dụng Hadoop với HBase cho bộ nhớ chính sau đó họ có các mảng máy chủ lớn với nhiều bộ nhớ.

Một bất tiện là nếu bạn xóa một trạng thái, bạn phải xóa nó ở mọi nơi ... Lợi thế lớn cho giải pháp này, mỗi người dùng sẽ có một loạt trạng thái đã sẵn sàng! Trong giải pháp trước nếu bạn theo dõi 3 người, bạn cần lấy tất cả các nguồn cấp dữ liệu của họ rồi sắp xếp chúng, sau đó hiển thị chúng ...

[Chỉnh sửa] Giống như Shekhar chỉ ra nhận xét, Mongo có giới hạn tài liệu.Bạn cần tạo bộ sưu tập trạng thái để lưu trạng thái hai lần, một lần cho người dùng2 và một lần cho người dùng1 và cần phải có từId, toId, trạng thái và thời gian

+0

Do kích thước tài liệu trong MongoDB không được lớn hơn 16 MB . Bạn sẽ không đạt được giới hạn và cuối cùng bạn phải tạo một bộ sưu tập mới? – Shekhar

+0

Thực sự là vì ví dụ của tôi là từ Facebook sử dụng HBase, cho MongoDb bạn có thể tạo bộ sưu tập trạng thái, khi user2 đẩy trạng thái bạn lưu hai lần, một lần cho user2 và lần thứ hai cho user1, tài liệu trạng thái của bạn sẽ chứa một từI , một toId, thời gian và chính trạng thái ... – zzarbi

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