Đây là vấn đề fan-in và fan-out. Tôi khuyên bạn nên thử fan-out:
Giữ một feed
bộ sưu tập cho người dùng của bạn. Khi người dùng tải lên một tài liệu, hãy chèn một mục nguồn cấp dữ liệu mới vào mỗi bộ sưu tập mục nguồn cấp dữ liệu của bạn bè cô ấy. Bộ sưu tập có thể trông như thế này:
{
"_id": (some id)
"UserId": (id of the user who 'owns', i.e. reads this feed)
"FriendId": (if of the friend who posted the file)
"FriendName": "John Doe" (name of the fried, denormalized)
"Timestamp": ...
}
Sử dụng chỉ mục kết hợp {UserId, Timestamp}
.
Cách tiếp cận này khá nặng nề:Nếu Jane có hàng trăm bạn bè, hàng trăm lượt chèn này sẽ làm mất thời gian của họ. Mặt khác, dù sao thì việc tải lên một tệp cũng mất rất nhiều thời gian, do đó chi phí không đáng kể và việc đọc của bạn sẽ đơn giản đến mức nực cười.
Tất nhiên, điều này có thể được tối ưu hóa thêm với nhiều nỗ lực hơn, nhưng nó sẽ ổn đối với lưu lượng truy cập khá lớn.