एक अधिसूचना प्रणाली को समझना


15

मैं एसई और अन्य जगहों पर एक अधिसूचना प्रणाली का निर्माण करने का तरीका देख रहा हूं और खुद को उस समाधान के लिए तैयार पाया जो यहां स्वीकृत उत्तर है: /programming/9735578/building-a-notification-system जो उपयोग करता है यह संरचना:

╔═════════════╗      ╔═══════════════════╗      ╔════════════════════╗
notification       notification_object      notification_change 
╟─────────────╢      ╟───────────────────╢      ╟────────────────────╢
ID           ║—1:n—→║ID                 ║—1:n—→║ID                  
userID             notificationID           notificationObjectID
╚═════════════╝      object                   verb                
                     ╚═══════════════════╝      actor               
                                                ╚════════════════════╝

एक अधिसूचना किसी चीज़ (वस्तु = घटना, दोस्ती ..) के बारे में है (क्रिया = जोड़ा, अनुरोध किया गया है) किसी व्यक्ति (अभिनेता) द्वारा और उपयोगकर्ता (विषय) को रिपोर्ट किया गया। यहां एक सामान्यीकृत डेटा संरचना है (हालांकि मैंने MongoDB का उपयोग किया है)। आपको परिवर्तनों के बारे में कुछ उपयोगकर्ताओं को सूचित करने की आवश्यकता है। तो यह प्रति-उपयोगकर्ता सूचनाएँ हैं .. जिसका अर्थ है कि यदि 100 उपयोगकर्ता शामिल थे, तो आप 100 सूचनाएं उत्पन्न करते हैं।

मैंने पहले सोचा था कि मैं इस दृष्टिकोण को समझ गया हूं, लेकिन जब मैंने इसे लागू करने के लिए तैयार होना शुरू किया तो मुझे एहसास हुआ कि मैं इसे विशेष रूप से अच्छी तरह से नहीं समझता। उत्तर पर अंतिम कुछ टिप्पणियाँ अन्य उपयोगकर्ताओं के प्रश्न हैं जिन्हें हल समझने में भी परेशानी हुई है।

मुझे यकीन नहीं है कि यह वह मॉडल है जिसका मैं अनुसरण कर रहा हूं, लेकिन इसकी संख्या कितनी है, मुझे यकीन है कि इससे मुझे इसे समझने में लाभ होगा , और मैं निश्चित रूप से अधिक सीखना चाहूंगा। मुझे आशा है कि यह उन लोगों के लिए भी उपयोगी होगा, जिन्हें इस समाधान को प्राप्त करने में परेशानी हुई है (संयोग से, मेरे पास इस सवाल का जवाब देने के लिए पर्याप्त इंटरनेट बिंदु नहीं हैं, इस प्रश्न पर किसी और को निर्देश दें!)

प्रशन

अगर मैं इसे सही समझता हूं, तो notification_bjectID एक विदेशी कुंजी है जो notification_object टेबल की ओर इशारा करती है , और सूचना नोटिफिकेशन तालिका की ओर इशारा करते हुए एक विदेशी कुंजी है । ऐसा लगता है जैसे ऑब्जेक्ट डेटाबेस प्रविष्टि की आईडी का उल्लेख करने वाली एक विदेशी कुंजी होनी चाहिए, अधिसूचना के बारे में है (उदाहरण के लिए एक विशिष्ट घटना या पोस्ट), लेकिन क्या हमें उस आईडी को इंगित करने के लिए किसी अन्य फ़ील्ड की आवश्यकता नहीं है?

लेखक ने लिखा

notification_object.object एक स्ट्रिंग "मैत्री" की तरह परिवर्तन प्रकार की पहचान करता है, इसके अतिरिक्त डेटा के साथ परिवर्तित वस्तु का वास्तविक संदर्भ जो मैं बात करता हूँ, वह है notification_change.notificationObjectID में

जो मुझे समझ में नहीं आता है। ऑब्जेक्ट एक स्ट्रिंग है (enum?) और notificationObjectID एक विदेशी कुंजी है जिसका संदर्भ उस वस्तु से है जिसके बारे में अधिसूचना है? फिर मध्य और दाएं तालिकाओं को कैसे जोड़ा जाता है?

ऐसा लगता है कि मध्य तालिका निर्दिष्ट करती है कि अधिसूचना किस वस्तु (या प्रकार की वस्तु) के बारे में है, जैसे कोई घटना या पोस्ट। उसके बाद हम एक ही ऑब्जेक्ट प्रकार की ओर इशारा करते हुए notification_change में कई प्रविष्टियाँ ले सकते हैं , जो हमें सूचनाओं को बंडल करने की अनुमति देती है (जैसे "X की दीवार पर पोस्ट किए गए 25 उपयोगकर्ता) - इसलिए मध्य और दाएँ तालिकाओं के बीच 1: n संबंध है।

लेकिन बाएं और मध्य तालिकाओं के बीच 1: n संबंध क्यों है? क्या हम "सैम की दीवार पर तैनात 25 उपयोगकर्ता" देने जा रहे हैं और "मैरी ने अपने" फ्राइडे पिकनिक "इवेंट को एक ही नोटिफिकेशन आईडी के रूप में अपडेट किया है? यदि एक ही उपयोगकर्ता के सभी नोटिफिकेशन में एक ही नोटिफिकेशन आईडी है, तो हमें टेबल की भी आवश्यकता क्यों है? बाएं?

एक प्रदर्शन सवाल - कहते हैं कि जॉन मैरी की पिकनिक घटना पर एक टिप्पणी पोस्ट करता है। ऐसा लगता है कि हमें यह देखने के लिए एक खोज करने की आवश्यकता होगी कि क्या इससे पहले कि हम notification_change प्रविष्टि बनाए, इससे पहले कि मेरी Picnic के लिए एक notification_object मौजूद है । क्या यह प्रदर्शन पर नकारात्मक प्रभाव डाल रहा है, या यह एक गैर-मुद्दा है? पिछले पैराग्राफ के प्रश्नों को जारी रखते हुए, हम कैसे पता होगा जो अधिसूचना प्रवेश बात करने के लिए notification_object के लिए?

जवाबों:


8

इस तरह के गहन सवालों के लिए धन्यवाद, और भ्रम के सभी के लिए खेद है - प्रारंभिक उत्तर के 1 साल बाद टिप्पणी करना मुश्किल है और अब 3 साल बाद है। प्रारंभिक विचार मुझे फीका करते हैं और मुझे भ्रमित भी करते हैं, लेकिन मुझे डर है कि मैं छेद वाली चीज को संपादित करूं क्योंकि मैं काम नहीं कर रहा हूं अभी बैकएंड पर सूचनाओं को संग्रहीत करने पर और सुनिश्चित नहीं है कि मैं व्यावहारिक अनुप्रयोग के बिना अच्छा निर्णय लेता हूं

मुझे लगता है कि लेखन के समय:

  • हां और नहीं, नोटिफिकेशन एक विदेशी कुंजी थी, notificationObjectID नहीं था। तालिकाओं को एक साथ जोड़ने के लिए आपको एक और FK फ़ील्ड की आवश्यकता है। मैं अपने आम अनुभव को इसके बारे में इतना स्पष्ट नहीं होने का दोष देता हूं :(
  • हां और नहीं, notification_object.object अस्पष्ट है क्योंकि आपके पास यह केवल एक स्ट्रिंग, या कुछ जटिल (JSON, या FK) के रूप में हो सकता है। मेरे मामले में यह सिर्फ एक संज्ञा थी।

तो यह सब इस बात पर निर्भर करता है कि आपकी सूचनाएं कैसे दिखती हैं। साधारण मामले के लिए, आप बस संपूर्ण अधिसूचना को किसी URL से लिंक करना चाहते हैं, जैसे मित्र पृष्ठ - यही कारण है कि एक स्ट्रिंग के रूप में ऑब्जेक्ट (एंटीकाइप) उपयोगी है - आप इसे URL टाई करते हैं।

अधिसूचना "आपके पास 3 मित्र अनुरोध जोड़े गए हैं" को अलग तरीके से संग्रहीत किया जा सकता है।

यदि आप उन्हें एक बार दिखाना चाहते हैं - तो आपके पास 3 सूचनाएँ, 3 अधिसूचना ऑब्जेक्ट (friend_request) और सूचना में 3 प्रविष्टियाँ होंगी-जो विशिष्ट मित्र उपयोगकर्ता से लिंक करें।

यदि आप एक सूचना दिखाना चाहते हैं - तो आपके पास 1 सूचना, 1 / अधिक ऑब्जेक्ट और 3 / अधिक क्रियाएं होंगी। तो इस जटिल मामले में, जैसे «आपके पास उपयोगकर्ता ए, उपयोगकर्ता बी, उपयोगकर्ता सी» से 3 मित्र अनुरोध हैं - आप प्रत्येक उपयोगकर्ता के लिए अधिसूचनाओब्जेक्ट्स का उपयोग करते हैं और आपके अधिसूचना पाठ में कई लिंक हैं।

क्या आपको 1 या 3 friend_request ऑब्जेक्ट का उपयोग करना चाहिए? पर निर्भर करता है

  1. वस्तु क्या है और क्रिया क्या है। क्या «लेख पसंद आया / टिप्पणी की गई»? या क्या यह «लाइक / कमेंट जोड़ा गया» और ऑब्जेक्ट पदानुक्रम केवल प्रदर्शन के दौरान जुड़ा हुआ है? यहाँ facebook «उपयोगकर्ता टिप्पणी» से «फोटो टिप्पणी» में भेद कर रहा है »जो शब्दार्थ रूप से बहुत करीब लगता है - आपके पास एक ही फोटो, एक ही अभिनेता है लेकिन विभिन्न सूचनाएं जो एक साथ विलय हो सकती थीं

यहाँ छवि विवरण दर्ज करें

  1. क्या आप एक अधिसूचना निकाल सकते हैं या क्या आपको इतिहास की आवश्यकता है? इसलिए यदि मैं एक फ्रेंड रिक्वेस्ट भेजता हूं और फिर उसे रद्द करता हूं, या टिप्पणी करता हूं और फिर एक लेख हटाता हूं, जैसे और फिर कुछ के विपरीत - क्या यह दो अलग-अलग क्रियाओं के रूप में अंतिम उपयोगकर्ता को यह इतिहास (एक और कार्रवाई के रूप में) दिखाना चाहिए? शायद ऩही। इसके अलावा टेचींकली अधिक जटिल - आपको यह खोजना होगा कि क्या कोई मौजूदा नोटिफिकेशन_बॉज है, इसमें नया नोटिफिकेशन_चेंज करें (यदि नहीं - कोई नई वस्तु जोड़ें) ताकि बाद में मुझे इसे हटाने के लिए notification_change के माध्यम से खोजना होगा। इसके बजाय मैं बस एक ही नोटिफिकेशन में एक और नोटिफिकेशन_बॉज जोड़ दूंगा और इसे हटा दूंगा अगर इसकी कार्रवाई कैस्केड-डिलीट हो रही है।

दूसरी ओर, ऐसे मामले भी हो सकते हैं, जहाँ क्रियाओं का समूह बनाना उपयोगी हो सकता है, जहाँ इतिहास से कुछ भी मिटाया नहीं जाता है।

मुझे लगता है कि लेखन के समय, बाएं और मध्य तालिकाओं के बीच 1: n संबंध क्यों बनाया गया था - ताकि आप न केवल एक ही इकाई (मध्य-दाएं तालिकाओं) पर अभिनेताओं द्वारा सूचनाओं को समूहित कर सकें, बल्कि कई ऑब्जेक्ट / संस्थाओं द्वारा भी।

लेकिन निश्चित रूप से, आप पूरे मामले को सरल बना सकते हैं और बाएं-मध्य संबंध को n: 1 पर उल्टा करके भंडारण को अनुकूलित कर सकते हैं, ताकि आपके पास एक घटना के लिए प्रति उपयोगकर्ता सूचनाएं उत्पन्न हों।

ताकि यह इस तरह दिखे ..

╔═════════════╗      ╔═══════════════════╗      ╔════════════════════╗
notification       notification_object      notification_change 
╟─────────────╢      ╟───────────────────╢      ╟────────────────────╢
ID           ║←—n:1—║ID                 ║—1:n—→║ID                  
noteObjFK          entityType               noteObjFK           
viewerUserID       entityID                 actionOnEntity      
╚═════════════╝      ╚═══════════════════╝      actorUserID         
                                                ╚════════════════════╝

उम्मीद है कि इससे मदद मिली


महान, इस पूरी तरह से उत्तर के लिए धन्यवाद। मैं इसके माध्यम से जाऊंगा और आपको बताऊंगा कि क्या मेरे पास कोई और प्रश्न है, लेकिन मुझे लगता है कि यह चीजों को बहुत अच्छी तरह से समझाता है।
user45623
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.