2009-03-18 14 views
5

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

तो मेरा सवाल यह है कि रिकॉर्ड की अवधि समाप्त करने के लिए सबसे अच्छा तरीका है।

मैं अक्सर एक date_expired स्तंभ जो datetime क्षेत्र है जोड़ लिया है। आम तौर पर मैं क्वेरी करता हूं कि date_expired = 0 या date_expired = 0 OR date_expired > NOW() पर निर्भर करता है कि डेटा भविष्य में समाप्त होने जा रहा है या नहीं। इसी तरह, मैंने फ़ील्ड कॉल expired_flag भी जोड़ा है। जब यह सत्य/1 पर सेट होता है, तो रिकॉर्ड समाप्त हो जाता है। यह शायद सबसे आसान तरीका है, हालांकि आपको किसी भी समय केवल मौजूदा आइटम चाहिए, जब आप समाप्ति खंड को शामिल करना याद रखना चाहते हैं।

एक अन्य विधि मैंने देखा है एक संग्रह तालिका में रिकॉर्ड बढ़ रहा है, लेकिन यह काफी गंदा हो सकता है जब वहाँ तालिकाओं कि इतिहास तालिकाओं की आवश्यकता होती है की एक बड़ी संख्या है। यह मूल्य (पुनर्प्राप्ति देश) को भी अधिक कठिन बनाता है क्योंकि आपको पहले बाएं शामिल करना होता है (उदाहरण के लिए) और फिर वास्तविक मान खोजने के लिए दूसरी क्वेरी करें (या एक संशोधित बाएं शामिल के साथ क्वेरी को फिर से करें)।

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

क्या इनमें से अन्य समाधान या संशोधन बेहतर हैं?

मैं MySQL (PHP) के साथ उपयोग कर रहा हूँ, इसलिए मैं अगर अन्य डेटाबेस इस मुद्दे से निपटने के लिए बेहतर तरीकों पता नहीं है।

+0

रिकॉर्ड चलती वास्तव में FKS साथ रेफेरेंन्शिअल सत्यनिष्ठा के साथ गंदा हो सकता है, मुझे लगता है कि जब – Sam

+1

अच्छा सवाल की जरूरत है, जिस तरह से ध्वज का उपयोग कर रिकॉर्ड फिल्टर करने के लिए बेहतर है! – Sam

उत्तर

3

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

+0

हां, उत्पाद तालिका या कर जैसे किसी मामले में काफी उपयोगी है। –

1

मुझे लगता है कि date_expired स्तंभ जोड़ने का सबसे आसान और कम से कम आक्रामक तरीका है। जब तक आपके INSERTS और SELECTS स्पष्ट कॉलम सूचियों का उपयोग करते हैं (वे होना चाहिए यदि वे नहीं हैं) तो आपके मौजूदा सीआरयूडी परिचालनों पर कोई प्रभाव नहीं पड़ता है। date_expired कॉलम पर एक इंडेक्स जोड़ें और डेवलपर इसे किसी भी कक्षा या तर्क के लिए एक संपत्ति के रूप में जोड़ सकते हैं जो मौजूदा तालिका में डेटा पर निर्भर करता है। प्रयास के लिए सभी बेहतरीन मूल्य में सभी। मैं मानता हूं कि अन्य तरीकों (यानी संग्रह तालिका) तुलनात्मक रूप से परेशानी में हैं।

1

मुझे आमतौर पर डेटाबेस ट्रिगर्स पसंद नहीं हैं, क्योंकि वे अदृश्य "दृश्यों के पीछे" व्यवहार कर सकते हैं, लेकिन इतिहास तालिका में लगभग हटाए गए डेटा को सम्मिलित करने के लिए हटाए जाने पर ट्रिगर डालना एक हो सकता है विकल्प।

मेरे अनुभव में, हम आम तौर पर सिर्फ एक "सक्रिय" बिट, या एक "DateExpired" datetime आप की तरह उल्लेख का उपयोग करें। यह बहुत अच्छी तरह से काम करता है, और सौदा करने और पूछताछ के लिए वास्तव में आसान है।

यहां एक संबंधित पोस्ट है जो कुछ अन्य विकल्प प्रदान करता है। शायद सीडीसी विकल्प?

SQL Server history table - populate through SP or Trigger?

-1

इस समस्या का ओरेकल द्वारा एक बहुत अच्छा दृष्टिकोण partitions है। मुझे नहीं लगता कि MySQL के समान कुछ है।

1

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

कुछ संभव enumerated मानों का उपयोग कर, अपनी आवश्यकताओं पर निर्भर करता है:

  1. सक्रिय
  2. हटाए गए
  3. निलंबित
  4. inuse (एक छद्म ताला लगा तंत्र की क्रमबद्ध करें)

स्तंभ को एक छोटे से के रूप में सेट करें (वह SQL सर्वर है ... MySQL समकक्ष के बारे में सुनिश्चित नहीं है)। यदि आप चाहें तो तालिकाओं के बीच कुंजी/मूल्य जोड़े और एक विदेशी कुंजी बाधा के साथ एक मिलान लुकअप तालिका भी सेट कर सकते हैं।

2

मुझे date_expired विकल्प पर expired_flag विकल्प पसंद है, यदि क्वेरी की गति आपके लिए महत्वपूर्ण है।

0

कुछ फ़ील्ड हैं जो मेरे टेबल में आमतौर पर हैं: creat_date, last_modification, last_modifier (उपयोगकर्ता के लिए fk), is_active (डेटाबेस पर निर्भर करता है, बूलियन या संख्या)।

+0

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

+0

महान विचार, मुझे कहना है। एक और विकल्प मैन्युअल रूप से परिवर्तनों का ट्रैक रखने के बजाय डेटाबेस के ऑडिटिंग विकल्पों का उपयोग करना होगा, लेकिन आपका अच्छा है: सरल और प्रभावी। – Sam

1

मैंने हमेशा ValidFrom, ValidTo दृष्टिकोण का उपयोग किया है जहां प्रत्येक तालिका में इन दो अतिरिक्त फ़ील्ड हैं। यदि ValidTo Is Null or > Now() तो आप जानते हैं कि आपके पास वैध रिकॉर्ड है। इस तरह आप लाइव होने से पहले तालिका में डेटा भी जोड़ सकते हैं।

0

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

कोई भी "सर्वश्रेष्ठ" नहीं है - प्रत्येक अलग-अलग आवश्यकताओं का जवाब देता है।

यहां एक साफ सारांश है।

टाइप 1: नया रिकॉर्ड मूल रिकॉर्ड को प्रतिस्थापित करता है। पुराने रिकॉर्ड का कोई निशान मौजूद नहीं है।

  • प्रकार 4 इस पर एक बदलाव एक और मेज पर इतिहास चलता है।

टाइप 2: ग्राहक आयाम तालिका में एक नया रिकॉर्ड जोड़ा जाता है। अंतर करने के लिए, आवश्यकतानुसार कॉलम की "मान्य तिथि सीमा" जोड़ी। यह "यह रिकॉर्ड चालू है" ध्वज रखने में मदद करता है।

टाइप 3: परिवर्तन को प्रतिबिंबित करने के लिए मूल रिकॉर्ड संशोधित किया गया है।

  • इस मामले में, कॉलम के एक या अधिक पिछले मानों को बदलने की संभावना है। इसकी स्पष्ट सीमा है क्योंकि यह कॉलम की एक विशिष्ट संख्या से जुड़ी है। हालांकि, यह अक्सर अन्य प्रकार के संयोजन के साथ प्रयोग किया जाता है।

यदि आप "धीरे-धीरे बदलते आयाम" की खोज करते हैं तो आप इसके बारे में अधिक पढ़ सकते हैं।

http://en.wikipedia.org/wiki/Slowly_Changing_Dimension

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

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