उन मदों की एक तालिका जिसमें (संभावित) लाखों रिकॉर्ड होंगे।
यह वास्तव में इतना नहीं है, जो SQL सर्वर कुशलता से संभाल सकता है। बेशक, मुझे अपनी पहले की नौकरियों में से एक याद है, जहां सबसे बड़ी तालिकाओं में से एक (एक-उदाहरण प्रणाली) में 2 मिलियन पंक्तियाँ थीं और वह सबसे अधिक थी जिसे मैंने कभी निपटा दिया था। फिर अगली नौकरी में 17 प्रोडक्शन इंस्टेंसेस थे जिनमें कुछ टेबल्स में लाखों-लाखों पंक्तियाँ थीं, और सभी को एक डेटा वेयरहाउस में एकत्रित किया गया था, जिसमें कई फैक्टर टेबल 1 बिलियन से अधिक पंक्तियाँ थीं। मुझे गलत मत समझो, मैं लाखों पंक्तियों में नहीं चिल्ला रहा हूं, मैं सिर्फ इस बात पर जोर दे रहा हूं कि एक अच्छा डेटा मॉडल और उचित अनुक्रमण (और सूचकांक रखरखाव) के साथ, SQL सर्वर बहुत कुछ संभाल सकता है ।
किसी भी समय 50% तक आइटम "अस्वीकृत" हो सकते हैं।
हम्म। यह सही नहीं लगता। "अनुमोदन" प्रविष्टियों की दर नई प्रविष्टियां प्राप्त करने की दर से आधी होगी? प्रत्येक 2 नई प्रविष्टियों के लिए, केवल 1 "अनुमोदित" होगा? 2 मिलियन पंक्तियों के अपने उदाहरण में, और "स्वीकृत" और "अप्राप्त" के लिए 1 मिलियन प्रत्येक, कुछ साल बाद एक और 10 मिलियन प्रविष्टियों के साथ, आपको "स्वीकृत" और "अस्वीकृत" के लिए 6 मिलियन प्रत्येक की उम्मीद है? या क्या यह है कि 1 मिलियन "अप्राप्त" कुछ स्थिर रहेगा, जैसे कि 10 मिलियन नई प्रविष्टियों के साथ, 11 मिलियन "स्वीकृत" और अभी भी 1 मिलियन "अप्राप्त" होंगे?
रिकॉर्ड "स्वीकृत" हो सकते हैं, लेकिन इसके विपरीत नहीं।
यह आज सच है , लेकिन समय के साथ चीजें बदल जाती हैं और इसलिए हमेशा संभावना होती है कि व्यवसाय "अप्रतिष्ठित", या शायद कुछ अन्य स्थिति, जैसे "संग्रहीत", आदि के लिए अनुमति दे सकता है।
तो, आइए विकल्पों को देखें:
झंडा (या संभवतः TINYINT
"स्थिति")
- प्रत्येक स्थिति के प्रश्नों के लिए थोड़ा धीमा
- समय के साथ अधिक लचीला / एक नया लुकअप स्टेटस मान के साथ तीसरे राज्य (जैसे "आर्काइव्ड") जैसे परिवर्तन को शामिल करना आसान है। कोई नई तालिका (आवश्यक रूप से), कुछ नया कोड, केवल कुछ कोड अपडेट किया गया।
- एकल
TINYINT
कॉलम को अपडेट करने में कम काम (यानी कोड, परीक्षण, आदि) और कम कमरा
- कम जटिल = समय के साथ कम रखरखाव की लागत, नए कर्मचारियों के लिए प्रशिक्षण का कम समय
- (संभवतः) एक तालिका के अद्यतन के रूप में लेन-देन लॉग के लिए छोटा प्रभाव
- बस "RecordStatus" के लिए एक लुकअप तालिका और दो तालिकाओं के बीच FK की आवश्यकता है।
दो अलग-अलग टेबल ("स्वीकृत" के लिए एक, "अप्रयुक्त" के लिए)
- प्रत्येक स्थिति के प्रश्नों के लिए थोड़ा तेज़
- समय के साथ कम लचीला / एक तीसरे राज्य (जैसे "संग्रहीत") जैसे परिवर्तन को शामिल करने के लिए कठिन; नए राज्य को सबसे अधिक संभावना एक और तालिका की आवश्यकता होगी, और निश्चित रूप से नए और अद्यतन कोड।
- अधिक कार्य (अर्थात कोड, परीक्षण, आदि) और "अप्रतिबंधित" तालिका से "स्वीकृत" तालिका में त्रुटि के लिए अधिक स्थान।
- अधिक जटिल = समय के साथ उच्च रखरखाव लागत, नए कर्मचारियों के लिए लंबे समय तक प्रशिक्षण का पता लगाने के लिए
- (संभवतः) लेन-देन लॉग करने के लिए ग्रेटर प्रभाव के रूप में एक तालिका हटा दी जाती है और एक डाला जाता है
- " आइटम आईडी के नवीकरण " के बारे में चिंता करने की कोई आवश्यकता नहीं है : अनपेक्षित तालिका में आईडी स्तंभ है जो एक
IDENTITY
स्तंभ है, और स्वीकृत तालिका में आईडी स्तंभ है जो एक नहीं है IDENTITY
(जैसा कि वहां इसकी आवश्यकता नहीं है)। इसलिए आईडी मान तालिकाओं के बीच रिकॉर्ड चाल के रूप में सुसंगत रहते हैं।
व्यक्तिगत रूप से, मैं StatusID
शुरुआत करने के लिए कॉलम के साथ एकल तालिका की ओर झुकूंगा । दो तालिकाओं का उपयोग करना अधिक जटिल, समय से पहले अनुकूलन जैसा लगता है। इस प्रकार के अनुकूलन पर चर्चा की जा सकती है यदि / जब रिकॉर्ड की संख्या लाखों की संख्या में है और अनुक्रमण कोई प्रदर्शन लाभ प्रदान नहीं करता है।