डेटाबेस डिजाइन - स्टोर राज्य या गणना राज्य हर बार?


17

मान लीजिए कि मेरे पास रिलेशनल डेटाबेस एप्लिकेशन और "उपयोगकर्ता" ऑब्जेक्ट और "संदेश" ऑब्जेक्ट है। अब मैं इस उपयोगकर्ता को अपठित संदेशों की संख्या दिखाना चाहता हूं।

इसे संग्रहीत करने का सबसे अच्छा तरीका क्या है? क्या मैं उपयोगकर्ता में एक फ़ील्ड का परिचय देता हूँ और यदि उपयोगकर्ता एक संदेश पढ़ता है और एक को पढ़ता है तो गिनती को कम करता है? या क्या मैं उस उपयोगकर्ता के लिए संदेशों की संख्या की गणना करने के लिए हर बार एक क्वेरी निष्पादित करता है जो बिना पढ़े फ़्लैग किए जाते हैं?

मुझे लगता है कि पहला दृष्टिकोण अधिक जटिल और त्रुटि प्रवण है, लेकिन दूसरे दृष्टिकोण से बेहतर प्रदर्शन करेगा।

यह सामान्य रूप से कैसे किया जाता है या बेहतर तरीका क्या है?


1
कई कारकों पर निर्भर करता है: क्या आपका DB विभाजन है? आप कितनी पंक्तियों / उपयोगकर्ता की उम्मीद कर रहे हैं? आप किस आकार के कुल DB की अपेक्षा कर रहे हैं (या कितने कुल उपयोगकर्ता)? आप प्रति सेकंड कितने अनुरोध कर रहे हैं? यह सब सटीक नहीं है, लेकिन कुछ मोटे विचार हैं ...
ओमर इकबाल

10
+1 यह एक क्लासिक रिलेशनल डेटाबेस प्रश्न है। सामान्य करने के लिए, या सामान्य करने के लिए नहीं? यह सवाल है। चाहे t'is nobler स्कीमा में अपमानजनक दोहराव के गुलेल और तीर को झेलने के लिए, या ट्रिगर ले, और रोजगार के द्वारा, उन्हें समाप्त करें?
रॉस पैटरसन

मैं तर्क देता हूं कि यह एक क्लासिक रिले है। db। प्रश्न, साइट पर पहले से ही एक उत्तर होना चाहिए, इसे डीयूपी के रूप में बंद किया जाना चाहिए, या हमारे पास कोई जवाब नहीं है और इसे खुला छोड़ दिया जाना चाहिए।
मटनज़

जवाबों:


14

यह सामान्य रूप से कैसे किया जाता है या बेहतर दृष्टिकोण क्या है?

सबसे अच्छा तरीका यह है कि इसे बिना किसी अतिरिक्त क्षेत्र के पहले आज़माएं, प्रदर्शन को मापें, और अगर यह वास्तव में बहुत धीमा हो जाता है, तो आप अनुकूलन करने का प्रयास करते हैं। इसका मतलब एक अतिरिक्त क्षेत्र का उपयोग करके अपने पहले दृष्टिकोण पर स्विच करना हो सकता है, लेकिन आपको अन्य विकल्पों के साथ-साथ परीक्षण करने पर भी विचार करना चाहिए, उदाहरण के लिए, अपने संदेशों पर संयुक्त फ़ील्ड ("अपठित", "userID") पर एक अतिरिक्त सूचकांक डालना।


2
सबसे अच्छा तरीका है (पहले सरल विधि के साथ जाएं)। सामान्य नियम विशेष से बेहतर हैं, fwiw। (+1 के लिए "परीक्षण!" हालांकि।)
डौग्म

9

डेटाबेस सिद्धांत के लिए पाठ्यपुस्तक समाधान के लिए आपके डेटाबेस में कोई मूल्य नहीं होगा जो कि अन्य डेटा के मूल्यों पर निर्भर करता है, क्योंकि ये परिवर्तनशील निर्भरताएं हैं । उन क्षेत्रों का होना जो अन्य क्षेत्रों के आधार पर गणना किए गए मान हैं, सामान्यीकरण का उल्लंघन है, क्योंकि यह अनावश्यक जानकारी की ओर जाता है।

हालाँकि, कभी-कभी पाठ्यपुस्तक क्या कहती है और व्यवहार में सबसे व्यावहारिक तरीका क्या होता है। अपठित संदेशों की संख्या की गणना प्रत्येक पेजव्यू काफी महंगा ऑपरेशन हो सकता है। -अनुरूप संख्या में कैशिंग userप्रदर्शन के लिए बेहतर होगा। लागत यह होगी कि डेटाबेस में मौजूद विसंगतियों के लिए यह संभव है: यह संभव हो सकता है कि अपठित-काउंटर को अपडेट करने के लिए याद किए बिना किसी संदेश को हटाया, जोड़ा या पढ़ा जाए।


4
संगति समस्या ट्रिगर पर INSERTया उस काउंटर को समायोजित करने के साथ चाटना आसान है DELETE। (या UPDATE, एक संदेश के मालिक को बदलने के लिए खाते में।) एक अच्छा DBMS ऑपरेशन करेगा और ट्रिगर्स को एक ही लेनदेन में चलाएगा, इसलिए या तो सभी या कोई भी ऐसा नहीं होगा।
ब्लरफुल

4

संभावित समस्या प्रदर्शन है और आपके पास प्रदर्शन समस्या नहीं है, फिर भी। समाधान # 1 में इसे संभालने के लिए आप पसंद के डेटाबेस पर निर्भर करते हुए कई चीजें कर सकते हैं: अनुक्रमण, हार्डवेयर, कैशिंग, आदि। यह सब इस बात पर निर्भर करता है कि उपयोगकर्ता को वर्तमान अपठित संदेश गणना प्राप्त करने की कितनी बार आवश्यकता है। इनमें से कई विकल्पों में ऐप की ओर कस्टम कोडिंग की आवश्यकता नहीं होती है, इसलिए आप उन्हें कोड परिवर्तन या बहुत कम के साथ लागू कर सकते हैं। एप्लिकेशन के साथ विकसित करना आसान बनाता है।

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

हर बार जब कोई संदेश पढ़ा जाता है, तो IsRead को फ्लैग करने के लिए एक यात्रा होती है? फ़ील्ड किसी अन्य फ़ील्ड के पुनर्गणना के बिना पर्याप्त है।

# 2 समाधान के साथ (किसी फ़ील्ड में / डिस्क पर गिनती रखते हुए), क्या समस्या होने पर आपको इस क्षेत्र को समय-समय पर पुनर्निर्माण / पुनर्गठित करने के लिए दिनचर्या की आवश्यकता होगी? और हमेशा समस्याएं होती हैं। क्या आप लेन-देन में यह सब लपेटने जा रहे हैं? हर बार जब कोई व्यक्ति किसी और को संदेश भेजता है तो वह विफल हो सकता है क्योंकि यह उपयोगकर्ता तालिका के लॉक होने के कारण उपयोगकर्ता के अनरीडाउंट को अपडेट नहीं कर सकता है? या आप इस क्षेत्र के लिए एक अलग तालिका बनाने जा रहे हैं?


+1 को गिनती के क्षेत्रों के साथ प्रदर्शन के मुद्दों का उल्लेख करने के लिए
winkbrace

0

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

फिर जैसा कि डॉक्टर कहते हैं, इस दृष्टिकोण के प्रदर्शन को मापें और फिर आप यह बता पाएंगे कि क्या आपको एक अलग रास्ता अपनाने की आवश्यकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.