ฉันค้นหาวิธีการสร้างระบบการแจ้งเตือนใน SE และที่อื่น ๆ และพบว่าตัวเองถูกดึงไปยังโซลูชันที่เป็นคำตอบที่ยอมรับได้ที่นี่: /programming/9735578/building-a-notification-system ซึ่งใช้ โครงสร้างนี้:
╔═════════════╗ ╔═══════════════════╗ ╔════════════════════╗
║notification ║ ║notification_object║ ║notification_change ║
╟─────────────╢ ╟───────────────────╢ ╟────────────────────╢
║ID ║—1:n—→║ID ║—1:n—→║ID ║
║userID ║ ║notificationID ║ ║notificationObjectID║
╚═════════════╝ ║object ║ ║verb ║
╚═══════════════════╝ ║actor ║
╚════════════════════╝
การแจ้งเตือนเกี่ยวกับบางสิ่งบางอย่าง (object = event, มิตรภาพ .. ) กำลังถูกเปลี่ยนแปลง (กริยา = เพิ่ม, ขอ .. ) โดยบางคน (นักแสดง) และรายงานต่อผู้ใช้ (เรื่อง) นี่คือโครงสร้างข้อมูลปกติ (แม้ว่าฉันจะใช้ MongoDB) คุณต้องแจ้งผู้ใช้บางคนถึงการเปลี่ยนแปลง ดังนั้นจึงเป็นการแจ้งเตือนแบบต่อผู้ใช้ .. หมายความว่าหากมีผู้ใช้ 100 คนที่เกี่ยวข้องคุณสร้างการแจ้งเตือน 100 รายการ
ตอนแรกฉันคิดว่าฉันเข้าใจวิธีการนี้ แต่เมื่อฉันเริ่มพร้อมที่จะนำไปใช้ฉันรู้ว่าฉันไม่เข้าใจเป็นอย่างดี ความคิดเห็นสุดท้ายเกี่ยวกับคำตอบคือคำถามจากผู้ใช้รายอื่นที่มีปัญหาในการเข้าใจวิธีแก้ไขปัญหา
ฉันไม่แน่ใจว่านี่เป็นแบบจำลองที่ฉันจะตามมา แต่ได้รับจำนวน upvotes ที่มีฉันแน่ใจว่ามันจะเป็นประโยชน์ต่อฉันที่จะเข้าใจมันและแน่นอนฉันต้องการเรียนรู้เพิ่มเติม ฉันหวังว่านี่จะเป็นประโยชน์กับผู้อื่นที่มีปัญหาในการเข้าใจวิธีแก้ไขปัญหานี้ (โดยบังเอิญฉันไม่มีคะแนนอินเทอร์เน็ตพอที่จะแสดงความคิดเห็นในคำตอบที่นำไปสู่คำถามนี้ได้โปรดทำอย่างอื่น!)
คำถาม
ถ้าผมเข้าใจมันขวาnotificationObjectIDเป็นสำคัญต่างประเทศชี้ไปที่notification_objectตารางและnotificationIDเป็นชี้ต่างประเทศที่สำคัญกับการแจ้งเตือนตาราง ดูเหมือนว่าวัตถุควรเป็น foreign key ที่อ้างถึง ID ของรายการฐานข้อมูลที่มีการแจ้งเตือน (เช่นเหตุการณ์หรือโพสต์ที่เฉพาะเจาะจง) แต่เราไม่ต้องการฟิลด์อื่นเพื่อระบุว่าเป็นตารางใด
ผู้เขียนเขียน
notification_object.object ระบุประเภทการเปลี่ยนแปลงเช่นสตริง "มิตรภาพ" การอ้างอิงจริงไปยังวัตถุที่เปลี่ยนแปลงด้วยข้อมูลเพิ่มเติมที่ฉันพูดถึงอยู่ใน notification_change.notificationObjectID
ซึ่งดูเหมือนจะไม่สมเหตุสมผลสำหรับฉัน วัตถุเป็นสตริง (enum?) และ notificationObjectID เป็นคีย์ต่างประเทศที่อ้างถึงวัตถุที่มีการแจ้งเตือน? แล้วตารางกลางและขวาเชื่อมต่อกันอย่างไร?
ดูเหมือนว่าโต๊ะกลางจะระบุว่าวัตถุใด (หรือชนิดของวัตถุ) ที่มีการแจ้งเตือนเช่นอีเวนต์หรือโพสต์ จากนั้นเราสามารถมีรายการจำนวนมากในnotification_changeซึ่งชี้ไปที่ประเภทวัตถุเดียวกันซึ่งทำให้เราสามารถรวมการแจ้งเตือน (เช่น "ผู้ใช้ 25 คนโพสต์บนวอลล์ของ X) - ดังนั้นความสัมพันธ์ 1: n ระหว่างตารางกลางและขวา
แต่ทำไมถึงมีความสัมพันธ์ 1: n ระหว่างตารางด้านซ้ายและกลาง เราจะให้ "ผู้ใช้ 25 คนโพสต์บนผนังของแซม" และ "แมรี่ได้อัปเดตรหัสการแจ้งเตือนเดียวกัน" วันศุกร์ปิคนิค "ของเธอหรือไม่หากการแจ้งเตือนทั้งหมดสำหรับผู้ใช้รายเดียวกันมีรหัสการแจ้งเตือนเดียวกัน ซ้าย?
คำถามเกี่ยวกับประสิทธิภาพ - พูดว่า John โพสต์ความคิดเห็นเกี่ยวกับกิจกรรมปิกนิกของ Mary ดูเหมือนว่าเราจะต้องทำการค้นหาเพื่อดูว่าnotification_objectมีอยู่แล้วสำหรับปิคนิคของ Mary ก่อนที่เราจะสร้างรายการnotification_change สิ่งนี้จะส่งผลเสียต่อประสิทธิภาพการทำงานหรือไม่เป็นปัญหาหรือไม่ อย่างต่อเนื่องคำถามจากวรรคก่อนหน้านี้วิธีการที่เราจะทราบว่าการแจ้งเตือนการเข้าชี้notification_objectเพื่อ?