Giả sử chúng tôi có một trang web phổ biến. Chúng ta cần phải thực hiện nhắn tin giống như thư giữa người dùng. giải pháp điển hình là sử dụng 2 bảng:Cơ sở dữ liệu MySQL có thể mở rộng để nhắn tin giống như thư
Người dùng (user_id)
Tin nhắn (message_id, sender_id (tài liệu tham khảo user_id), receiver_id (tài liệu tham khảo user_id), chủ đề, cơ thể).
Phương pháp này có 2 hạn chế đáng kể
- Tất cả thông điệp của tất cả người dùng được lưu trữ trong một bảng dẫn đến nó tải cao và làm giảm hiệu suất cơ sở dữ liệu tổng thể.
- Khi ai đó cần gửi tin nhắn cho nhiều người dùng cùng lúc, tin nhắn sẽ được sao chép (recipient_count) lần.
Các giải pháp khác sử dụng 3 bảng:
Người dùng (user_id)
Sent_messages (sent_id, sender_id (tài liệu tham khảo user_id), chủ đề, cơ thể)
Received_messages (sent_id, receiver_id (tham chiếu user_id), chủ đề, nội dung)
chủ đề và nội dung của received_messages được sao chép từ các trường tương ứng của sent_messages.
Phương pháp này dẫn đến
- Denormalizing cơ sở dữ liệu bằng cách sao chép thông tin từ một bảng khác
- Người dùng thực sự có thể delete gửi/nhận tin nhắn mà không loại bỏ chúng ra khỏi máy thu/người gửi.
- Tin nhắn mất khoảng 2 lần nhiều không gian
- Mỗi bảng được tải ít hơn khoảng 2 lần.
Vì vậy, đây đi các câu hỏi:
- Mà một trong những thiết kế được coi là tốt hơn cho tải cao và khả năng mở rộng? (Tôi nghĩ nó là cái thứ hai)
- Có thiết kế cơ sở dữ liệu nào khác có thể xử lý tải cao không? Nó là gì? Những hạn chế là gì?
Cảm ơn!
P.S. Tôi hiểu rằng trước khi đến các vấn đề về khả năng mở rộng này, trang web phải rất thành công, nhưng tôi muốn biết phải làm gì nếu cần.
CẬP NHẬT
Hiện nay đối với các phiên bản đầu tiên tôi sẽ sử dụng thiết kế bởi Daniel Vassallo đề xuất.Nhưng nếu mọi thứ đều ổn trong tương lai, thiết kế sẽ được thay đổi thành thứ hai. Cảm ơn Evert vì đã làm tôi lo lắng về điều đó.
Cảm ơn!Tôi cũng xem thiết kế này. Trên thực tế sau khi đăng câu hỏi này tôi (về tinh thần :)) đã sửa đổi thiết kế đầu tiên thành Người dùng (user_id) Tin nhắn (message_id, sender_id, receiver_id, message_content_id) Message_content (message_content_id, subject, body) Vì vậy, cả hai thiết kế này đều tốt hơn đầu tiên (trong không gian thực hiện và hiệu suất bảng). Có lẽ câu hỏi về câu hỏi phải là một cái gì đó như: tốt hơn là lưu trữ tất cả thư trong một bảng hay sao chép chúng thành hai? Ảnh hưởng đến hiệu suất sẽ ảnh hưởng như thế nào? –