Tôi đã xem xét cách xây dựng một hệ thống thông báo trên SE và các nơi khác và thấy mình bị cuốn hút vào giải pháp đó là câu trả lời được chấp nhận ở đây: /programming/9735578/building-a-notification-system sử dụng cấu trúc này:
╔═════════════╗ ╔═══════════════════╗ ╔════════════════════╗
║notification ║ ║notification_object║ ║notification_change ║
╟─────────────╢ ╟───────────────────╢ ╟────────────────────╢
║ID ║—1:n—→║ID ║—1:n—→║ID ║
║userID ║ ║notificationID ║ ║notificationObjectID║
╚═════════════╝ ║object ║ ║verb ║
╚═══════════════════╝ ║actor ║
╚════════════════════╝
Một thông báo là về một cái gì đó (object = event, Friendship ..) đang được thay đổi (verb = thêm, yêu cầu ..) bởi ai đó (diễn viên) và báo cáo cho người dùng (chủ đề). Đây là cấu trúc dữ liệu được chuẩn hóa (mặc dù tôi đã sử dụng MongoDB). Bạn cần thông báo cho người dùng nhất định về những thay đổi. Vì vậy, đó là thông báo cho mỗi người dùng .. có nghĩa là nếu có 100 người dùng tham gia, bạn sẽ tạo ra 100 thông báo.
Lúc đầu tôi nghĩ rằng tôi hiểu cách tiếp cận này, nhưng khi tôi bắt đầu sẵn sàng thực hiện nó, tôi nhận ra rõ ràng là tôi không hiểu rõ lắm. Một số ý kiến cuối cùng về câu trả lời là câu hỏi từ những người dùng khác, những người cũng gặp khó khăn trong việc hiểu giải pháp.
Tôi không chắc đây có phải là mô hình mà tôi sẽ theo dõi không, nhưng với số lượng upvote nó có, tôi chắc chắn rằng nó sẽ có lợi cho tôi để hiểu nó, và tôi chắc chắn muốn tìm hiểu thêm. Tôi hy vọng nó cũng sẽ được sử dụng cho những người gặp khó khăn trong việc nắm bắt giải pháp này (tình cờ, tôi không có đủ điểm internet để để lại nhận xét về câu trả lời đó cho câu hỏi này, bất cứ ai khác làm ơn!)
Câu hỏi
Nếu tôi hiểu đúng, notificationObjectID là chìa khóa trỏ nước ngoài cho notification_object bảng, và notificationID là khóa ngoại trỏ đến các thông báo bảng. Có vẻ như đối tượng phải là khóa ngoại đề cập đến ID của mục nhập cơ sở dữ liệu mà thông báo nói về (ví dụ: một sự kiện hoặc bài đăng cụ thể), nhưng sau đó chúng ta không cần một trường khác để chỉ ra ID đó thuộc về bảng nào?
Tác giả đã viết
notify_object.object xác định loại thay đổi, như chuỗi "tình bạn" Tham chiếu thực tế đến đối tượng đã thay đổi với dữ liệu bổ sung mà tôi nói đến là trong notify_change.notificationObjectID
điều đó dường như không có ý nghĩa với tôi. Đối tượng là một chuỗi (enum?) Và notifyObjectID là một khóa ngoại liên quan đến đối tượng mà thông báo nói về? Sau đó, các bảng giữa và phải được kết nối như thế nào?
Có vẻ như bảng giữa chỉ định đối tượng (hoặc loại đối tượng) mà thông báo nói về, ví dụ như một sự kiện hoặc bài đăng. Sau đó, chúng tôi có thể có nhiều mục trong notify_change trỏ đến cùng một loại đối tượng, cho phép chúng tôi gói thông báo (như "25 người dùng được đăng trên tường của X) - do đó có mối quan hệ 1: n giữa các bảng giữa và phải.
Nhưng tại sao lại có mối quan hệ 1: n giữa các bảng bên trái và giữa? Chúng ta sẽ cung cấp cho "25 người dùng được đăng trên tường của Sam" và "Mary đã cập nhật sự kiện" Thứ sáu dã ngoại "của cô ấy cùng một ID thông báo? Nếu tất cả các thông báo cho cùng một người dùng có cùng ID thông báo, tại sao chúng ta thậm chí cần bảng trên trái?
Một câu hỏi về hiệu suất - nói rằng John đăng bình luận về sự kiện dã ngoại của Mary. Có vẻ như chúng ta cần phải tra cứu để xem liệu notify_object đã tồn tại cho Mary's Picnic trước khi chúng ta tạo mục thông báo_change. Đây có phải là tác động tiêu cực đến hiệu suất, hoặc nó không phải là một vấn đề? Tiếp tục các câu hỏi từ đoạn trước, làm thế nào để chúng ta biết mục thông báo nào để trỏ thông báo_object đến?