एक डेटाबेस में एक पंक्ति के हर परिवर्तन की रिकॉर्डिंग कैसे सामान्य रूप से संग्रहीत की जाती है?


10

मैं जिस प्रोजेक्ट पर काम कर रहा हूं, डेटाबेस के कुछ टेबलों में पंक्तियों के हर बदलाव को आगे के ऑडिट या रोलबैक के लिए ट्रैक किया जाना चाहिए । यह पता लगाना आसान होगा कि पंक्ति को किसने संशोधित किया, किस आईपी पते से और कब, और पिछले संस्करण को पुनर्स्थापित करने में सक्षम हो।

स्टैक एक्सचेंज द्वारा उदाहरण के लिए इसी तरह की चीज का उपयोग किया जाता है। जब मैं किसी और के प्रश्न को बदलता हूं, तो यह संभव है कि मैंने इसे बदल दिया, और परिवर्तनों को रोलबैक करने के लिए।

किसी डेटाबेस में किसी वस्तु को हर परिवर्तन को संग्रहीत करने के लिए इस्तेमाल की जाने वाली सामान्य तकनीक क्या है , यह देखते हुए कि मेरे वर्तमान स्कीमा में ज्यादातर एक ही गुण हैं (नीचे) जो एक औसत व्यापार ऐप है?

  • वस्तुओं का आकार अपेक्षाकृत छोटा होता है: nvarchar(1000)उदाहरण के लिए कुछ हो सकते हैं , लेकिन बाइनरी डेटा की बड़ी मात्रा में नहीं, यह एक डिस्क पर सीधे संग्रहीत किया जा रहा है, और सीधे एक्सेस किया गया है, और Microsoft SQL के माध्यम से नहींfilestream ,
  • डेटाबेस लोड बहुत कम है और पूरे डेटाबेस को एक सर्वर पर एक वर्चुअल मशीन द्वारा नियंत्रित किया जाता है,
  • पिछले संस्करणों की पहुँच नवीनतम संस्करण तक पहुँच जितनी तेज़ नहीं है, लेकिन फिर भी अप-टू-डेट² होनी चाहिए और बहुत धीमी गति से नहीं।

<Tl-डॉ>

मैंने निम्नलिखित मामलों के बारे में सोचा, लेकिन मुझे उन प्रकार के परिदृश्यों के साथ कोई वास्तविक अनुभव नहीं है, इसलिए मैं अन्य लोगों की राय सुनूंगा:

  1. आईडी और संस्करण द्वारा पंक्तियों को अलग करते हुए, एक ही तालिका में सब कुछ स्टोर करें। IMO, यह गंभीर रूप से मूर्खतापूर्ण है, और प्रदर्शन स्तर पर जल्द या बाद में चोट करेगा। इस दृष्टिकोण के साथ, नवीनतम आइटम और संस्करणों के ट्रेस के लिए एक अलग सुरक्षा स्तर सेट करना भी असंभव है। अंत में, प्रत्येक प्रश्न लिखने के लिए अधिक जटिल होगा। दरअसल, अप-टू-डेट डेटा तक पहुंचने के लिए, मुझे आईडी द्वारा सब कुछ समूह करने और प्रत्येक समूह में अंतिम संस्करण को पुनः प्राप्त करने के लिए मजबूर किया जाएगा।

  2. नवीनतम संस्करण को एक तालिका में संग्रहीत करें, और, हर परिवर्तन पर, अप्रचलित संस्करण को किसी अन्य स्कीमा में किसी अन्य तालिका में कॉपी करें। दोष यह है कि हर बार, हम हर मूल्य को संग्रहीत करते हैं, भले ही वह बदल नहीं गया हो। अपरिवर्तित मान सेट करना nullएक समाधान नहीं है, क्योंकि मुझे उस समय भी ट्रैक करना चाहिए जब मूल्य को nullया से बदल दिया जाता है null

  3. नवीनतम संस्करण को एक तालिका में संग्रहीत करें, और बदले हुए गुणों की सूची को अपने पिछले मानों के साथ किसी अन्य तालिका में संग्रहीत करें। ऐसा लगता है कि दो दोष हैं: सबसे महत्वपूर्ण यह है कि एक ही कॉलम में पिछले प्रकारों के विषम प्रकारों को क्रमबद्ध करने का एकमात्र तरीका है binary(max)। दूसरा यह है कि यह होगा, मेरा मानना ​​है कि उपयोगकर्ता को पिछले संस्करणों को प्रदर्शित करते समय ऐसी संरचना का उपयोग करना अधिक कठिन है।

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

</ Tl-डॉ>


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

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


3
प्रासंगिक: SQL सर्वर डेटा कैप्चर बदलें
निक चम्मास

जवाबों:


8

इस तरह का ऑडिट लॉगिंग सामान्य तरीके से एक छाया तालिका है और आप ऑडिट कर रहे हैं आधार तालिका पर ट्रिगर के साथ लॉग परिवर्तन होता है। अन्य तालिकाओं को एक अलग भौतिक डिस्क पर रखा जा सकता है यदि आपको प्रदर्शन के लिए आवश्यक है, और यदि आप डेटा की त्वरित पुनर्प्राप्ति का समर्थन करने की आवश्यकता है, तो आप उन पर अनुक्रमित कर सकते हैं।

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

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

डेटाबेस में वेब सर्वर से कनेक्ट होने वाले आईपी पते के बारे में पता करने का कोई तरीका नहीं है। एप्लिकेशन को लेनदेन के साथ आईपी पते को स्पष्ट रूप से कैप्चर करना होगा और लॉग इन करना होगा।

यदि आपके पास ऑडिट करने के लिए बड़ी संख्या में टेबल हैं, तो आप प्रोग्रामर को प्रोग्रामर जनरेट करने के लिए सिस्टम डेटा डिक्शनरी से मेटाडेटा का उपयोग कर सकते हैं।

यह समाधान कई कारणों से सबसे अच्छा है:

  • यह तालिका के किसी भी परिवर्तन को कैप्चर करता है, न कि केवल एप्लिकेशन द्वारा किए गए।

  • ऑडिट टेबल को आपके प्राथमिक टेबल पर I / O लोड को कम करने के लिए डिस्क के एक अलग सेट पर रखा जा सकता है।

  • आप तालिका के एक संघ के आधार पर एक दृश्य का उपयोग कर सकते हैं और ऑडिट लॉग टेबल जो वर्तमान संस्करण सहित पूरे इतिहास को दिखाएगी।

  • आप ऑडिट लॉग टेबल को आवश्यक रूप से अनुक्रमित कर सकते हैं ताकि ऑडिट उपयोगकर्ता उन्हें जिम्मेदारी से क्वेरी कर सकें। हमेशा की तरह, सूचकांक चयन क्वेरी प्रदर्शन और अपडेट ओवरहेड के बीच एक ट्रेडऑफ है।


आप यह कहने का प्रयास करें कि क्या मेरे पास 1000 तालिका है जिसे मुझे किसी भी परिवर्तन के लिए लॉग बनाए रखना है तो मुझे 1000 छाया तालिका का निर्माण करना होगा? और परिवर्तन पर कब्जा करने के लिए 1000 ट्रिगर? यदि हाँ तो यह फर्जी विचार है ... हम बदले हुए डेटा को पकड़ने और लॉग इन करने के लिए एक एकल इतिहास तालिका और एकल ट्रिगर बना सकते हैं। हम उस तालिका में पुराने और नए पंक्ति डेटा को एक xml के रूप में संग्रहीत कर सकते हैं .... जो कि बहुत से लोग करते हैं .... मैं स्पष्ट हूँ !!
थॉमस

1
1000 तालिकाओं के लिए आप एक यूटिलिटी लिखते हैं जो सिस्टम डेटा डिक्शनरी से परिभाषाओं को पढ़ता है और ट्रिगर्स और टेबल परिभाषाओं को उत्पन्न करता है। मैंने इसे 560 टेबल वाले सिस्टम पर किया है और यह ठीक काम करता है।
कंसर्नडऑफटुनब्रिजवेल्स

0

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

इसके अलावा, रिकॉर्ड की संख्या और प्रत्येक पंक्ति के संशोधन की संख्या आपके निर्णय में महत्वपूर्ण भूमिका निभाएगी।


0

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.