Tôi chắc rằng Facebook không lưu trữ thông tin "như" như cách một số người khác đề xuất nó bằng RDBMS. Với hàng triệu người dùng và có thể hàng nghìn lượt thích, chúng tôi đang xem xét hàng nghìn hàng để tham gia ở đây sẽ ảnh hưởng đến hiệu suất.
Cách tiếp cận tốt nhất ở đây là nối thêm tất cả "lượt thích" trong một hàng. Ví dụ, một bảng với cột user_like_id của kiểu dữ liệu văn bản. Sau đó, tất cả id của những người thích bài viết được nối thêm. Trong trường hợp này, bạn chỉ truy vấn một hàng và bạn có mọi thứ. Điều này sẽ nhanh hơn rất nhiều so với việc tham gia các bảng và nhận được số lượng.
EDIT: Gần đây tôi chưa ở đây trên trang web này và tôi vừa phát hiện ra câu trả lời này đã được giảm giá. Vâng, đây là example post with like count and their avatars. Đây là thiết kế của tôi, nơi tôi chỉ thực hiện những gì tôi đang nói về.
Hai thành phần ở đây là 1.) Bảng XREF và 2.) Đối tượng JSON.
Các lượt thích vẫn được lưu trữ trên bảng XREF. Nhưng đồng thời, dữ liệu được nối thêm vào đối tượng JSON và được lưu trữ trên một cột văn bản trên bảng đăng bài.
Tại sao tôi lưu trữ thông tin thích trên cột văn bản dưới dạng JSON? Vì vậy, không cần phải tìm kiếm/tham gia db cho các lượt thích. Nếu ai đó không giống như bài đăng, đối tượng JSON chỉ được cập nhật.
Bây giờ tôi không biết tại sao câu trả lời này lại bị một số người dùng bỏ phiếu ở đây. Câu trả lời này cung cấp truy xuất dữ liệu nhanh chóng. Điều này gần với phương pháp NoSQL, đó là cách truy cập dữ liệu FB. Trong trường hợp này, không cần phải tham gia thêm/tra cứu để nhận thông tin về lượt thích.
Và đây là bảng chứa các lượt thích. Nó chỉ là một ánh xạ XREF đơn giản giữa bảng người dùng và mục.
Đó có thể là một giải pháp, tôi nghĩ rằng vấn đề là "mọi thứ" phải là một "Item" bởi vì điều gì sẽ xảy ra nếu bạn có một bảng không phải là một Item và một ngày nào đó bạn muốn một cái gì đó cho nó? Tôi nghĩ rằng đôi khi đơn giản hơn là tốt hơn, tại sao không tạo ra sự thừa kế ngược lại? giống như là cha mẹ và bạn có một bảng like_for_status với một FK để tình trạng, và like_for_photo, vv bạn có thể mở rộng nó dễ dàng cho bất kỳ bảng, và truy vấn của bạn cũng nhanh hơn. – Enrique
+1, mặc dù tôi nghĩ bạn có nghĩa là ** Bảng mỗi loại ** hoặc TPT. – Yuck
@Yuck: Có, TPT (thay vì Bảng-Mỗi phân cấp), mặc dù TPT và TPH, theo như tôi biết, một phần của từ vựng Khung thực thể chứ không phải là SQL tổng quát hơn. –