2009-08-16 11 views
5

मैं जल्द ही एक परियोजना पर काम शुरू कर दूंगा (spec से) मुझे थोड़ा सा स्टैक ओवरफ्लो याद दिलाता है। असल में, यह एक वेब ऐप है जिसमें उपयोगकर्ता द्वारा नियंत्रित सामग्री है।डीबी ऑब्जेक्ट्स का संस्करण नियंत्रण कार्यान्वित करना

मेरे दिमाग में मंडलियों में घूमने वाली सुविधाओं में से एक संस्करण नियंत्रण है। यहां StackOverflow पर, प्रत्येक प्रश्न और उत्तर में कई संशोधन हो सकते हैं। यह लागू करने के लिए बहुत आसान है जब आपके पास केवल एक प्रकार का ऑब्जेक्ट होता है (और, इस मामले में, इसका टेक्स्ट)।

तो, मेरे सरल पृष्ठों के लिए, मैं सेट हूं।

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

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

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

यह तब भी जटिल हो जाता है जब यह रिश्ता कई से अधिक हो जाता है, जहां एक पुस्तक में योगदान के रूप में कई लेखकों को सूचीबद्ध किया जा सकता है।

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

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

संपादित करें: स्पष्ट करने के लिए, मैं मूल डीबी डिज़ाइन, सामान्यीकरण, कई मैपिंग टेबल आदि को समझता हूं। मैं इस विशिष्ट स्थिति के लिए एक साफ समाधान की तलाश में हूं।

संपादित 2: मैं एक सामान्य समाधान की तलाश में हूं, क्योंकि किताबों की तुलना में सिस्टम में अधिक उप-वस्तुएं हो सकती हैं। लेखक अन्य लेखकों, पत्रिकाओं, घटनाओं, आदि इत्यादि से संबंधित हो सकता है। मुझे लगता है कि अगर मैं प्रत्येक के लिए व्यक्तिगत रूप से इतिहास लागू करता हूं तो मैं बहुत सारे काम दोहरा रहा हूं।

+0

@ जोश जोर्डन: क्षमा न करें। बिंदु पर और अधिक होने के लिए प्रश्न को ठीक करें। –

उत्तर

5

यह डाटा वेयरहाउसिंग में एक आम समस्या है। वे "धीरे-धीरे बदलते आयाम" का उपयोग करते हैं।

कुछ नियम होने चाहिए, हालांकि, यदि आप कोशिश करने जा रहे हैं और "संस्करण" डेटा है।

  1. आप लेखक-बुक संबंध रिकॉर्ड चाहिए के रूप में शुरू परिभाषित किया। यह आधिकारिक लेखक-पुस्तक संबंध है। यह कुछ डेटा वेयरहाउस लोगों को "तथ्य-कम तथ्य तालिका" कहते हैं। यह चाबियों के जोड़े है।

  2. पुस्तकें पुस्तक-लेखक तथ्य का एक आयाम हैं। पुस्तक बदल सकती है। कई धीरे-धीरे बदलते आयाम एल्गोरिदम हैं। आप केवल नवीनतम रख सकते हैं, इतिहास तालिका को वर्तमान से अलग कर सकते हैं। इतिहास से वर्तमान में अंतर करने के लिए ध्वज के साथ एक तालिका में इतिहास और वर्तमान रखें।

  3. लेखकों पुस्तक-लेखक तथ्य का एक आयाम हैं। लेखक बदल सकते हैं। फिर, कई एससीडी एल्गोरिदम हैं। विकल्पों पर पढ़ें। अधिक जानकारी के लिए राल्फ किमबाल के डेटा वेयरहाउस टूलकिट द्वारा।

ध्यान दें कि रिश्ते (पुस्तक के लिए लेखक) एक तथ्य है, और संस्करणों की आवश्यकता नहीं है। यह एक तथ्य है। यह "बदल नहीं" है। यह या तो सत्य है या इसे डेटाबेस में त्रुटि में रखा गया था - इस मामले में, इसे हटा दिया जाना चाहिए। तथ्यों को संस्करण संख्या की आवश्यकता नहीं है।

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

इसलिए, समय पुस्तक-लेखक तथ्य का एक आयाम है। यदि यह तथ्य बदल सकता है, तो लागू समय अवधि तथ्य के हिस्से के रूप में दर्ज की जाती है।

समय आयाम संस्करण संख्या के समान नहीं है। यह थोड़ा आसान है। यह बताता है कि समय पर एक निश्चित बिंदु पर, तथ्य सच था। यदि तथ्य बदलता है, तो आप एक अलग टाइमस्टैम्प के साथ एक नया तथ्य जोड़ते हैं।

आप समय में एक विशेष बिंदु दे सकते हैं, प्रासंगिक तथ्यों और संबंधित आयाम मानों का पता लगा सकते हैं।

+0

अच्छा शो। धन्यवाद। एससीडी साहित्य सहायक है। – JoshJordan

+0

धन्यवाद। मुझे टेबल पर प्रत्येक तालिका के पुराने डेटा को रखने के बजाय, प्रत्येक तालिका के लिए अलग-अलग इतिहास तालिका क्यों लेनी चाहिए, इस पर पुनर्विचार करना चाहिए। – ChrisW

+0

@ChrisW: एससीडी डिजाइन मुश्किल है। यह आपको प्राप्त होने वाले प्रश्नों के प्रकार पर निर्भर करता है। क्या लोग "काउंटर-फैक्टुअल" ("क्या-अगर") प्रश्न करते हैं? "क्या होगा यदि पिछले साल क्षेत्र परिभाषा के अनुसार इन बिक्री संख्याओं की सूचना मिली?" इस मामले में, आप ऐतिहासिक आयाम पंक्तियों के खिलाफ शामिल हो सकते हैं। यदि आप इसे शायद ही कभी करते हैं, तो एक अलग इतिहास तालिका चोट नहीं पहुंची है। यदि आप इसे अक्सर करते हैं, तो एक अलग इतिहास तालिका बहुत जटिल हो सकती है। –

1

मेरे पास प्रत्येक तालिका के लिए एक टेबल है: यानी लेखक और पुस्तक।

टेबल के बीच सामान्य विदेशी कुंजी संबंध (जो कुछ भी है) है।

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


संपादित करें:

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


कई-से-अनेक स्थिति के बारे में क्या?

मैं नहीं है: यह और अधिक कठिन है क्योंकि आप वास्तव में कोई रिकॉर्ड नहीं एक किताब के लिए एक लेखक मानचित्रण हो सकता था, लेकिन पहले एक पड़ा है और पता चलता है कि एक इतिहास आइटम के रूप में

# 2 संपादित की जरूरत है अभी तक कई स्थितियों का इतिहास लागू नहीं किया गया है, लेकिन मुझे नहीं लगता कि यह समान क्यों नहीं होगा, यानी:

  • बुक-लेखक तालिका होने के कारण कई से अधिक रिश्तों को लागू किया जाता है , जिनमें से प्रत्येक रिकॉर्ड केवल BookId प्लस AuthorId है।
  • ऐतिहासिक संबंध इसी पुस्तक AuthorHistory तालिका में हैं।
+0

कई से अधिक परिस्थितियों के बारे में क्या? यह अधिक कठिन है क्योंकि आपके पास वास्तव में एक पुस्तक के लिए एक लेखक मैपिंग रिकॉर्ड नहीं हो सकता है, लेकिन पहले एक था और इसे इतिहास आइटम के रूप में दिखाने की आवश्यकता है। – JoshJordan

+0

दरअसल, आप सही हैं। दुर्भाग्य से, यह एक बहुत ही सामान्य/स्केलेबल समाधान नहीं है। लागू होने वाली प्रत्येक नई तालिका के लिए इसे एक नई इतिहास तालिका की आवश्यकता है। – JoshJordan

+0

मुझे नहीं लगता कि इसके बारे में सामान्य/स्केलेबल क्या नहीं है: आईएमओ यह इस अर्थ में एक "सामान्य" समाधान है कि यह एक समाधान है जो किसी भी तालिका के सेट के लिए काम करता है। – ChrisW

1

लगभग सोफेडबी के लिए आदर्श उपयोग केस की तरह लगता है। इस दस्तावेज़-उन्मुख डेटाबेस के साथ आपको नि: शुल्क संशोधन मिलते हैं (प्रत्येक दस्तावेज़ स्वचालित रूप से तब तक संशोधित होता है जब तक आप अपना डेटाबेस अलग-अलग कॉन्फ़िगर नहीं करते)।

दस्तावेजों के बीच एम: एन संबंध होना भी संभव है। हालांकि, कॉच डीबी में माइग्रेट करना काफी बड़ा कदम है और मुझे नहीं पता कि यह एएसपी.नेट से कितनी अच्छी तरह से सुलभ है। लेकिन कुछ प्रारंभिक ट्यूटोरियल पढ़ना चोट नहीं पहुंचा सकता है।

संबंधित मुद्दे