Ben SE ve başka bir yerde bir bildirim sistemi oluşturmak için nasıl içine bakarak edilmiştir ve kendimi burada kabul cevabı olan çözüme çizilmiş bulundu: /programming/9735578/building-a-notification-system hangi kullanımları bu yapı:
╔═════════════╗ ╔═══════════════════╗ ╔════════════════════╗
║notification ║ ║notification_object║ ║notification_change ║
╟─────────────╢ ╟───────────────────╢ ╟────────────────────╢
║ID ║—1:n—→║ID ║—1:n—→║ID ║
║userID ║ ║notificationID ║ ║notificationObjectID║
╚═════════════╝ ║object ║ ║verb ║
╚═══════════════════╝ ║actor ║
╚════════════════════╝
Bir bildirim (nesne = olay, arkadaşlık ..) biri (oyuncu) tarafından değiştirilir (fiil = eklenir, talep edilir ..) ve kullanıcıya (konu) bildirilir. İşte normalleştirilmiş bir veri yapısı (MongoDB kullandığım halde). Bazı kullanıcıları değişiklikler hakkında bilgilendirmeniz gerekir. Kullanıcı başına bildirimlerdir. Yani 100 kullanıcı varsa 100 bildirim oluşturursunuz.
İlk başta bu yaklaşımı anladığımı düşündüm, ama uygulamaya hazırlandığımda, görünüşe göre özellikle iyi anlamadığımı fark ettim. Yanıtla ilgili son birkaç yorum, çözümü anlamada sorun yaşayan diğer kullanıcılardan gelen sorulardır.
Takip edeceğim model olup olmadığından emin değilim, ancak sahip olduğu yukarı oyların sayısı göz önüne alındığında, onu anlamamın fayda sağlayacağından eminim ve kesinlikle daha fazla bilgi edinmek istiyorum. Umarım bu da bu çözümü kavramakta zorluk çeken başkaları için de yararlı olacaktır (bu arada, bu soruya yönlendiren bu cevaba bir yorum bırakmak için yeterli internet puanım yok, lütfen başka biri yapın!)
Sorular
Ben doğru anladıysam, notificationObjectID bir yabancı anahtar işaret olduğunu notification_object masa ve notificationID işaret yabancı anahtardır bildirim masaya. Nesnenin , bildirimin ilgili olduğu veritabanı girişinin kimliğine atıfta bulunan yabancı bir anahtar olması gerektiği anlaşılıyor (örn. Belirli bir olay veya gönderi), ancak o zaman kimliğin hangi tabloya ait olduğunu belirtmek için başka bir alana ihtiyacımız yok mu?
Yazar yazdı
message_object.object, değişiklik türünü tanımlar, örneğin bir dize "dostluk" Değiştiğim nesneye bahsettiğim ekstra verileriyle gerçek referans, bildirim_değiştir.notificationObjectID
bu bana mantıklı gelmiyor. Nesne bir dize (enum?) Ve bildirimObjectID, bildirimin ilgili olduğu nesneye başvuran yabancı bir anahtar mı? Peki orta ve sağdaki tablolar nasıl birbirine bağlanır?
Ortadaki tablo, bildirimin hangi nesne (veya nesne türü) hakkında olduğunu, örneğin bir olayı veya postayı belirtiyor gibi görünüyor. Daha sonra, bildirim_değişimi aynı nesne türüne işaret eden birçok girişe sahip olabiliriz , bu da bildirimleri paketlememize izin verir ("X'in duvarında yayınlanan 25 kullanıcı gibi) - dolayısıyla orta ve sağ tablolar arasındaki 1: n ilişkisi.
Peki sol ve orta tablolar arasında neden 1: n ilişki var? "Sam'in duvarına 25 kullanıcı gönderdi" ve "Mary" Friday Picnic "etkinliğini aynı bildirim kimliğini verecek miyiz? Aynı kullanıcı için tüm bildirimlerin aynı bildirim kimliğine sahip olması durumunda, neden tablodaki tabloya ihtiyacımız var? ayrıldı?
Bir performans sorusu - John'un Mary'nin piknik etkinliği hakkında yorum yaptığını varsayalım. Bildirim_ Değişimi girişini oluşturmadan önce Mary'nin Pikniği için bir bildirim_nesnesi olup olmadığını görmek için bir arama yapmamız gerekiyor gibi görünüyor . Bu performansı olumsuz etkileyecek mi yoksa sorun değil mi? Biz hangi bilemez nasıl bir önceki paragrafta sorularını Sürekli bildirim işaret etmek giriş notification_object için?