मैं जिस प्रोजेक्ट पर काम कर रहा हूं, डेटाबेस के कुछ टेबलों में पंक्तियों के हर बदलाव को आगे के ऑडिट या रोलबैक के लिए ट्रैक किया जाना चाहिए । यह पता लगाना आसान होगा कि पंक्ति को किसने संशोधित किया, किस आईपी पते से और कब, और पिछले संस्करण को पुनर्स्थापित करने में सक्षम हो।
स्टैक एक्सचेंज द्वारा उदाहरण के लिए इसी तरह की चीज का उपयोग किया जाता है। जब मैं किसी और के प्रश्न को बदलता हूं, तो यह संभव है कि मैंने इसे बदल दिया, और परिवर्तनों को रोलबैक करने के लिए।
किसी डेटाबेस में किसी वस्तु को हर परिवर्तन को संग्रहीत करने के लिए इस्तेमाल की जाने वाली सामान्य तकनीक क्या है , यह देखते हुए कि मेरे वर्तमान स्कीमा में ज्यादातर एक ही गुण हैं (नीचे) जो एक औसत व्यापार ऐप है?
- वस्तुओं का आकार अपेक्षाकृत छोटा होता है:
nvarchar(1000)
उदाहरण के लिए कुछ हो सकते हैं , लेकिन बाइनरी डेटा की बड़ी मात्रा में नहीं, यह एक डिस्क पर सीधे संग्रहीत किया जा रहा है, और सीधे एक्सेस किया गया है, और Microsoft SQL के माध्यम से नहींfilestream
, - डेटाबेस लोड बहुत कम है और पूरे डेटाबेस को एक सर्वर पर एक वर्चुअल मशीन द्वारा नियंत्रित किया जाता है,
- पिछले संस्करणों की पहुँच नवीनतम संस्करण तक पहुँच जितनी तेज़ नहीं है, लेकिन फिर भी अप-टू-डेट² होनी चाहिए और बहुत धीमी गति से नहीं।
<Tl-डॉ>
मैंने निम्नलिखित मामलों के बारे में सोचा, लेकिन मुझे उन प्रकार के परिदृश्यों के साथ कोई वास्तविक अनुभव नहीं है, इसलिए मैं अन्य लोगों की राय सुनूंगा:
आईडी और संस्करण द्वारा पंक्तियों को अलग करते हुए, एक ही तालिका में सब कुछ स्टोर करें। IMO, यह गंभीर रूप से मूर्खतापूर्ण है, और प्रदर्शन स्तर पर जल्द या बाद में चोट करेगा। इस दृष्टिकोण के साथ, नवीनतम आइटम और संस्करणों के ट्रेस के लिए एक अलग सुरक्षा स्तर सेट करना भी असंभव है। अंत में, प्रत्येक प्रश्न लिखने के लिए अधिक जटिल होगा। दरअसल, अप-टू-डेट डेटा तक पहुंचने के लिए, मुझे आईडी द्वारा सब कुछ समूह करने और प्रत्येक समूह में अंतिम संस्करण को पुनः प्राप्त करने के लिए मजबूर किया जाएगा।
नवीनतम संस्करण को एक तालिका में संग्रहीत करें, और, हर परिवर्तन पर, अप्रचलित संस्करण को किसी अन्य स्कीमा में किसी अन्य तालिका में कॉपी करें। दोष यह है कि हर बार, हम हर मूल्य को संग्रहीत करते हैं, भले ही वह बदल नहीं गया हो। अपरिवर्तित मान सेट करना
null
एक समाधान नहीं है, क्योंकि मुझे उस समय भी ट्रैक करना चाहिए जब मूल्य कोnull
या से बदल दिया जाता हैnull
।नवीनतम संस्करण को एक तालिका में संग्रहीत करें, और बदले हुए गुणों की सूची को अपने पिछले मानों के साथ किसी अन्य तालिका में संग्रहीत करें। ऐसा लगता है कि दो दोष हैं: सबसे महत्वपूर्ण यह है कि एक ही कॉलम में पिछले प्रकारों के विषम प्रकारों को क्रमबद्ध करने का एकमात्र तरीका है
binary(max)
। दूसरा यह है कि यह होगा, मेरा मानना है कि उपयोगकर्ता को पिछले संस्करणों को प्रदर्शित करते समय ऐसी संरचना का उपयोग करना अधिक कठिन है।पिछले दो बिंदुओं के समान कार्य करें, लेकिन संस्करणों को एक अलग डेटाबेस में संग्रहीत करें। प्रदर्शन-वार, एक ही डेटाबेस में पिछले संस्करणों के द्वारा नवीनतम संस्करणों तक पहुंच को धीमा करने से बचने के लिए यह दिलचस्प हो सकता है; फिर भी, मेरा मानना है कि यह एक समयपूर्व अनुकूलन है और इसे केवल तभी किया जाना चाहिए जब एक प्रमाण हो कि एक ही डेटाबेस में पुराने और नवीनतम संस्करण होने से अड़चन है।
</ Tl-डॉ>
To उदाहरण के लिए, परिवर्तन को लॉग फ़ाइल में संग्रहीत करना अस्वीकार्य होगा, क्योंकि यह HTTP लॉग के लिए किया जाता है, और सर्वर लोड कम होने पर रात को लॉग से डेटाबेस में डेटा फ्लश करता है। विभिन्न संस्करणों के बारे में जानकारी तुरंत या लगभग तुरंत उपलब्ध होनी चाहिए; कुछ सेकंड देरी स्वीकार्य है।
Specific जानकारी को अक्सर और केवल विशिष्ट उपयोगकर्ताओं के समूह द्वारा एक्सेस नहीं किया जाता है, लेकिन फिर भी, उन्हें प्रदर्शित करने के लिए संस्करणों की सूची के लिए 30 सेकंड तक प्रतीक्षा करने के लिए मजबूर करना अस्वीकार्य होगा। फिर, कुछ सेकंड की देरी स्वीकार्य है।