Transact चार्ली द्वारा सुझाए गए अनुसार अपने परिचालन तालिकाओं को सामान्य करना , एक अच्छा विचार है, और समय के साथ कई सिरदर्द और समस्याओं को बचाएगा - लेकिन इंटरफ़ेस तालिकाओं के रूप में ऐसी चीजें हैं , जो बाहरी प्रणालियों के साथ एकीकरण, और रिपोर्टिंग का समर्थन करती हैं। तालिकाएं, जो विश्लेषणात्मक जैसी चीजों का समर्थन करती हैं प्रसंस्करण; और उन प्रकार की तालिकाओं को सामान्य रूप से सामान्य नहीं किया जाना चाहिए - वास्तव में, बहुत बार यह बहुत अधिक सुविधाजनक होता है और उनके लिए नहीं होना चाहिए ।
इस मामले में, मुझे लगता है कि आपके ऑपरेशनल टेबल के लिए Transact चार्ली का प्रस्ताव एक अच्छा है।
लेकिन मैं एकीकरण तालिका (बाहरी स्रोतों से डेटा लोड करना) के प्रयोजनों के लिए CompetitorName पर कुशल जोड़ों का समर्थन करने के लिए प्रतियोगी तालिका में एक सूचकांक (जरूरी नहीं कि अद्वितीय) जोड़ दूंगा, और मैं मिश्रण में एक इंटरफ़ेस तालिका डालूँगा: CompetitionResults।
CompetitionResults में आपके प्रतियोगिता के परिणाम जो भी डेटा होते हैं, उसमें होना चाहिए। इस तरह की एक इंटरफ़ेस तालिका का मतलब यह है कि इसे एक्सेल शीट या सीएसवी फ़ाइल से, जो भी आपके पास उस डेटा में है, को त्वरित और आसान बनाना और पुन: लोड करना है।
उस इंटरफ़ेस तालिका को परिचालन तालिकाओं के सामान्यीकृत सेट का हिस्सा नहीं माना जाना चाहिए। फिर आप कॉम्पिटिशन में शामिल हो सकते हैं। रिचर्ड द्वारा सुझाए गए अनुसार, प्रतियोगी में रिकॉर्ड डालने के लिए, जो पहले से मौजूद नहीं हैं, और जो अपडेट करते हैं (उदाहरण के लिए यदि आपके पास वास्तव में प्रतियोगियों के बारे में अधिक जानकारी है, जैसे उनका फोन नंबर या ईमेल पता)।
एक चीज जो मैं नोट करूंगा - वास्तव में, प्रतियोगी नाम, यह मुझे लगता है, आपके डेटा में अद्वितीय होने की बहुत संभावना नहीं है । उदाहरण के लिए, 200,000 प्रतियोगियों में, आपके पास 2 या अधिक डेविड स्मिथ हो सकते हैं। इसलिए मेरा सुझाव होगा कि आप प्रतियोगियों से अधिक जानकारी एकत्र करें, जैसे कि उनका फोन नंबर या ईमेल पता, या कुछ और जो अद्वितीय होने की अधिक संभावना है।
आपकी परिचालन तालिका, प्रतियोगी, प्रत्येक डेटा आइटम के लिए बस एक कॉलम होना चाहिए जो एक समग्र प्राकृतिक कुंजी में योगदान देता है; उदाहरण के लिए इसमें प्राथमिक ईमेल पते के लिए एक कॉलम होना चाहिए। लेकिन इंटरफ़ेस टेबल में एक प्राथमिक ईमेल पते के लिए पुराने और नए मूल्यों के लिए एक स्लॉट होना चाहिए , ताकि पुराने मूल्य का उपयोग प्रतियोगियों में रिकॉर्ड देखने के लिए किया जा सके और इसके नए हिस्से को नए मूल्य पर अपडेट किया जा सके।
तो CompetitionResults में कुछ "पुराने" और "नए" फ़ील्ड होने चाहिए - पुराने ईमेल, newEmail, oldPhone, newPhone, आदि। इस तरह आप CompetitorName, Email, और Phone से Competitors में एक कंपोजिट कुंजी बना सकते हैं।
फिर जब आपके पास कुछ प्रतियोगिता परिणाम होते हैं, तो आप अपनी एक्सेल शीट या जो कुछ भी आपके पास है, उससे अपने कॉम्पिटिशनResults टेबल को छोटा और फिर से लोड कर सकते हैं और सभी नए प्रतियोगियों को प्रतियोगी तालिका में सम्मिलित करने के लिए एक कुशल, सम्मिलित कर सकते हैं, और एकल, कुशल अद्यतन करने के लिए प्रतियोगिता प्रतियोगियों से मौजूदा प्रतियोगियों के बारे में सभी जानकारी। और आप CompetitionCompetitors तालिका में नई पंक्तियों को सम्मिलित करने के लिए एक एकल इंसर्ट कर सकते हैं। ये चीजें एक ProcessCompetitionResults संग्रहीत कार्यविधि में की जा सकती हैं, जिसे CompetitionResults तालिका लोड करने के बाद निष्पादित किया जा सकता है।
यह ओरेकल एप्लिकेशन, एसएपी, पीपुलसॉफ्ट, और अन्य एंटरप्राइज़ सॉफ़्टवेयर सुइट्स की कपड़े धोने की सूची के साथ वास्तविक दुनिया में मैंने जो कुछ भी देखा है, उसके बारे में अल्पविकसित विवरण है।
एक आखिरी टिप्पणी जो मैं करूंगा, वह एक है जो मैंने एसओ पर पहले की है: यदि आप एक विदेशी कुंजी बनाते हैं जो यह सुनिश्चित करती है कि प्रतियोगी तालिका में एक प्रतियोगी मौजूद है, तो इससे पहले कि आप उस प्रतियोगी के साथ एक पंक्ति जोड़ सकते हैं, प्रतिस्पर्धात्मकता में, सुनिश्चित करें कि विदेशी कुंजी को अपडेट और कैस्केड करने के लिए सेट किया गया है । इस तरह अगर आपको किसी प्रतियोगी को हटाने की आवश्यकता है, तो आप इसे कर सकते हैं और उस प्रतियोगी से जुड़ी सभी पंक्तियाँ अपने आप हट जाएँगी। अन्यथा, डिफ़ॉल्ट रूप से, विदेशी कुंजी के लिए आपको कॉम्पिटिशन.कॉम से सभी संबंधित पंक्तियों को हटाना होगा, इससे पहले कि वह आपको एक प्रतियोगी को हटा दे।
(कुछ लोगों को लगता है कि गैर-कैस्केडिंग विदेशी कुंजी एक अच्छा सुरक्षा एहतियात है, लेकिन मेरा अनुभव यह है कि वे बट में सिर्फ एक भयावह दर्द हैं जो एक ओवरसाइट के परिणामस्वरूप अधिक बार नहीं होते हैं और वे काम का एक गुच्छा बनाते हैं डीबीए के लिए। गलती से सामान हटाने वाले लोगों के साथ व्यवहार करना, इसीलिए आपके पास "आप सुनिश्चित हैं" जैसे संवाद और विभिन्न प्रकार के नियमित बैकअप और अनावश्यक डेटा स्रोत हैं। यह वास्तव में एक प्रतियोगी को नष्ट करना चाहता है, जिसका डेटा सभी चाहते हैं। उदाहरण के लिए गड़बड़, की तुलना में यह गलती से एक को हटाने के लिए है और फिर जाओ "ओह नहीं! मैं ऐसा करने का मतलब नहीं था! और अब मेरे पास उनकी प्रतियोगिता के परिणाम नहीं हैं! Aaaahh!" उत्तरार्द्ध निश्चित रूप से काफी आम है, इसलिए , आपको इसके लिए तैयार रहने की आवश्यकता है, लेकिन पूर्व कहीं अधिक सामान्य है,पूर्व, इमो के लिए तैयार करने का सबसे आसान और सबसे अच्छा तरीका है, बस विदेशी कुंजी कैस्केड अपडेट और डिलीट करना।)
NVARCHAR(64)
!! सबसे पहले - यह एक बहुत व्यापक कुंजी है - 128 बाइट तक; और दूसरा यह परिवर्तनशील आकार है - फिर से: इष्टतम नहीं है ... यह आपके लिए सबसे खराब विकल्प के बारे में है - आपका प्रदर्शन नरक होगा, और तालिका और सूचकांक विखंडन हर समय 99.9% होगा .....