Saya telah mencari cara untuk membangun sistem notifikasi pada SE dan di tempat lain dan menemukan diri saya tertarik pada solusi yang merupakan jawaban yang diterima di sini: /programming/9735578/building-a-notification-system yang menggunakan struktur ini:
╔═════════════╗ ╔═══════════════════╗ ╔════════════════════╗
║notification ║ ║notification_object║ ║notification_change ║
╟─────────────╢ ╟───────────────────╢ ╟────────────────────╢
║ID ║—1:n—→║ID ║—1:n—→║ID ║
║userID ║ ║notificationID ║ ║notificationObjectID║
╚═════════════╝ ║object ║ ║verb ║
╚═══════════════════╝ ║actor ║
╚════════════════════╝
Pemberitahuan adalah sesuatu (objek = acara, pertemanan ..) sedang diubah (kata kerja = ditambahkan, diminta ..) oleh seseorang (aktor) dan dilaporkan kepada pengguna (subjek). Berikut adalah struktur data yang dinormalisasi (meskipun saya telah menggunakan MongoDB). Anda perlu memberi tahu pengguna tertentu tentang perubahan. Jadi itu adalah pemberitahuan per pengguna .. artinya jika ada 100 pengguna yang terlibat, Anda menghasilkan 100 pemberitahuan.
Awalnya saya berpikir bahwa saya memahami pendekatan ini, tetapi ketika saya mulai bersiap untuk mengimplementasikannya, saya menyadari bahwa saya tampaknya tidak memahaminya dengan baik. Beberapa komentar terakhir tentang jawabannya adalah pertanyaan dari pengguna lain yang juga mengalami kesulitan dalam memahami solusinya.
Saya tidak yakin apakah ini model yang akan saya ikuti, tetapi mengingat jumlah upvote yang dimilikinya, saya yakin itu akan menguntungkan saya untuk memahaminya , dan saya pasti ingin belajar lebih banyak. Saya harap ini juga berguna bagi orang lain yang mengalami kesulitan dalam memahami solusi ini (kebetulan, saya tidak memiliki cukup poin internet untuk meninggalkan komentar pada jawaban yang mengarah ke pertanyaan ini, siapa pun tolong lakukan!)
Pertanyaan
Jika saya memahaminya dengan benar, notificationObjectID adalah kunci asing yang menunjuk ke tabel notification_object , dan notificationID adalah kunci asing yang menunjuk ke tabel notifikasi . Sepertinya objek harus berupa kunci asing yang merujuk ke ID dari entri basis data yang menjadi notifikasi (misalnya acara atau pos tertentu), tetapi bukankah kita memerlukan bidang lain untuk menunjukkan tabel yang menjadi milik ID?
Penulis menulis
notification_object.object mengidentifikasi tipe perubahan, seperti string "persahabatan" Referensi aktual untuk objek berubah dengan data ekstra yang saya bicarakan adalah di notification_change.notificationObjectID
yang tampaknya tidak masuk akal bagi saya. Objek adalah string (enum?) Dan notificationObjectID adalah kunci asing yang merujuk ke objek yang menjadi tujuan notifikasi? Lalu bagaimana tabel tengah dan kanan terhubung sama sekali?
Tampaknya tabel tengah menentukan objek apa (atau jenis objek) pemberitahuan tersebut, misalnya acara atau posting. Kami kemudian dapat memiliki banyak entri di notification_change yang mengarah ke jenis objek yang sama, yang memungkinkan kami untuk menggabungkan pemberitahuan (seperti "25 pengguna yang diposting di dinding X) - karenanya hubungan 1: n antara tabel tengah dan kanan.
Tetapi mengapa ada hubungan 1: n antara tabel kiri dan tengah? Apakah kita akan memberikan "25 pengguna yang diposting di dinding Sam" dan "Mary memperbarui acara" Piknik Jumat "nya dengan ID notifikasi yang sama? Jika semua notifikasi untuk pengguna yang sama memiliki ID notifikasi yang sama, mengapa kita bahkan memerlukan tabel di kiri?
Sebuah pertanyaan kinerja - katakanlah John memposting komentar tentang acara piknik Mary. Sepertinya kita perlu melakukan pencarian untuk melihat apakah notification_object sudah ada untuk Mary's Picnic sebelum kita membuat entri notification_change . Apakah ini akan berdampak negatif pada kinerja, atau itu bukan masalah? Melanjutkan pertanyaan dari paragraf sebelumnya, bagaimana kita tahu entri notifikasi mana untuk mengarahkan notification_object ?
sumber