6

6NF सिद्धांतों के लिए सामान्यीकृत डेटाबेस का उपयोग करते समय, आप ऐतिहासिक विशेषता डेटा कैसे संग्रहीत करेंगे?6 एनएफ और ऐतिहासिक विशेषता डेटा

Let उदाहरण के लिए कहते हैं कि हम @PerformanceDBA से लेकिन निम्नलिखित अतिरिक्त आवश्यकता के साथ this example ले:

हम अपने सभी उत्पादों के लिए ऐतिहासिक डाटा स्टोर करने की जरूरत है, हम सिर्फ एक तारीख दर्ज करें और प्राप्त करने में सक्षम होना चाहिए उस विशेष समय पर उत्पाद के गुणों का एक स्नैपशॉट।

एक और अधिक व्यावहारिक उदाहरण:
डिस्क और CPU के उदाहरण से मान लीजिए ऊपर आभासी रहे हैं और एक उपयोगकर्ता होगा पर डिस्क क्षमता बदल सकते हैं। हम डेटाबेस को कैसे बदल सकते हैं ताकि हम 5NF दृश्य को पर्याप्त तेज़ी से रखते हुए किसी भी समय किसी दिए गए डिस्क के गुणों को पुनर्प्राप्त कर सकें (बेशक इसकी सृजन तिथि के बाद)।

बातें मैं विचार कर रहा हूँ

  • एक टाइमस्टैम्प स्तंभ 'CHANGEDATE' प्रत्येक विशेषता मेज पर (यह एक सबक्वेरी के साथ एक सुंदर जटिल क्वेरी में परिणाम और प्रत्येक विशेषता तालिका के लिए शामिल हो जाएगा जोड़ें)
  • प्रत्येक विशेषता तालिका के लिए एक अलग * इतिहास तालिका बनाएं (परिणामस्वरूप बड़ी मात्रा में तालिका हो सकती है क्योंकि हमारे पास 20 उत्पाद प्रकार) में फैले 70 गुण हैं)
  • इसके अतिरिक्त: 5NF दृश्य

किसी भी मदद की सराहना की तेजी लाने के लिए प्रत्येक विशेषता मेज पर एक अनुक्रमित 'वर्तमान' कॉलम जोड़ने!


संपादित करें: मैं अस्थायी डेटाबेस की अवधारणा से पता है, अभी तक समस्या यह है कि डेटाबेस इंजन के लिए मैं के साथ (PostgreSQL) काम कर रहा हूँ लौकिक विस्तार पूरी तरह से अभी तक लागू नहीं किया गया है। अस्थायी डेटाबेस के बिना इसे कैसे प्राप्त किया जाए इस पर कोई सलाह है?

+1

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

+1

यह वह पोस्ट है जिसने मुझे सामान्य रूप से डेटाबेस को देखने के लिए शुरू किया है (सॉफ़्टवेयर इंजीनियरों के दृष्टिकोण से, डीबीए के दृष्टिकोण से): - http://stackoverflow.com/questions/4491173/historical- ऑडिटेबल-डेटाबेस - मैं यह नहीं कह रहा हूं कि सुझाव दिया गया है कि क्या किया गया है ("से" और "से" और इतिहास इतिहास नहीं), लेकिन मेरे लिए यह एक बड़ी गड़बड़ी पैदा कर रहा है, और मैं कभी नीचे नहीं जाऊंगा सड़क फिर से – Mark

उत्तर

9

हाल ही में स्वीकृत SQL: 2011 मानक उन सुविधाओं को शामिल करता है जो आपको इस तरह की समस्या से बेहतर तरीके से निपटने की अनुमति देते हैं।

ऐसा नहीं है कि आप अस्थायी क्षेत्र में जो कुछ करना चाहते हैं, वह करने में सक्षम होंगे, लेकिन वास्तव में एक महत्वपूर्ण सुधार हुआ है।

इसके बारे में अच्छी प्रस्तुति http://metadata-standards.org/Document-library/Documents-by-number/WG2-N1501-N1550/WG2_N1536_koa046-Temporal-features-in-SQL-standard.pdf पर है।

ध्यान दें कि उनके एसक्यूएल उत्पाद में इन सुविधाओं के लिए उचित समर्थन के साथ केवल एक ही विक्रेता है, एक दूसरे शायद इस पर काम कर रहा है, और एक तिहाई ने अपने ग्राहकों के लिए मतदान चैनल खोला है।

www.linkedin.com पर एक "टेम्पोरल डेटा" चर्चा समूह भी है जो आपके विषय पर सटीक रूप से समर्पित है।

संपादित करने की कोशिश कर रहा है "इस बारे में कोई सलाह है कि इसे अस्थायी डेटाबेस के बिना कैसे प्राप्त किया जाए?"

अपने मॉडल में केवल एक ही दिनांक/समय प्रकार कॉलम न जोड़ें। पहला कारण यह है कि आपने दिया है, दूसरा कारण यह है कि यह समाधान भी नए मानक द्वारा प्रचारित है, और यह सुविधा प्रदान करेगा एक बार उपलब्ध होने के बाद नई सुविधाओं का समर्थन करने वाले इंजनों में संक्रमण।

तो दोनों को एक स्टार्ट- और एक अंत-तिथि/समय कॉलम जोड़ें। उनमें से किसी को भी न बनाएं। नए मानक को इसकी अस्थायी सुविधाओं के लिए इसकी आवश्यकता है यदि अंत-एमआईटी (पल-इन-टाइम) अभी भी अज्ञात है, तो लागू समय प्रकार के उच्चतम मूल्य का उपयोग करें, उदाहरण के लिए 99 99-12-31।

आपको "प्रत्येक के लिए अलग इतिहास सारणी बनाने की आवश्यकता नहीं है विशेषता "। यह है एक "एकल इकाई तालिका" के समान रूप से संभव है जो "पूरी इकाई घटना का इतिहास" रखता है। नकारात्मकता यह है कि ACTUAL कुछ विशेष विशेषता में परिवर्तन हुआ है (क्योंकि आपको किसी भी विशेषता में किसी भी बदलाव के लिए नई ऐतिहासिक पंक्तियां मिलती हैं, संभवतः अधिकांश विशेषताओं के लिए समान विशेषता मान पर प्रतिलिपि बनाना) के लिए पूछना मुश्किल होगा। 'एकल तालिका' अंतरिक्ष का उत्सुक उपभोक्ता होने की संभावना है, 'प्रत्येक विशेषता के लिए अलग इतिहास' CPU समय पूछताछ का उत्सुक उपभोक्ता हो सकता है। यह एक संतुलित कार्य होगा, और जहां संतुलन ठीक है, आपकी विशेष स्थिति पर निर्भर करता है।

अपनी तालिकाओं में "अनुक्रमित 'वर्तमान' कॉलम" न जोड़ें। सबसे पहले, वे आपके इंजन के पास नई सुविधाओं में बदलाव करने में आपकी सहायता नहीं करेंगे, और दूसरा, वाई/एन कॉलम बहुत खराब भेदभावकर्ता हैं, और इसलिए इंडेक्सिंग के लिए बहुत गरीब उम्मीदवार हैं। मैं इंडेक्स में अपनी स्टार्ट- या एंड-मिट जोड़ना चाहता हूं, उन्हें उम्मीद है कि आपको 'वर्तमान' पंक्तियों के लिए एक ही जीत और गैर-मौजूदा पंक्तियों के लिए बेहतर जीत होगी, जब भी आपको उनसे पूछने की ज़रूरत है ।

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

क्या यह और सहायक था?

+0

धन्यवाद, अब मुझे postgresql (https://github.com/jeff-davis/PostgreSQL-Temporal/downloads) के लिए अस्थायी विस्तार के बारे में पता चला है जो मुझे लगता है कि मैं क्या देख रहा हूं। कुछ और व्यावहारिक उदाहरणों में मदद मिलेगी। – ChrisR

+0

यह सबसे उपयोगी था! उत्कृष्ट सलाह के लिए धन्यवाद! – ChrisR

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