डेटाबेस प्रविष्टियों (डेटा) के संस्करण की अनुमति देने के तरीके क्या हैं?
लेखों के वापस परिवर्तनों को वापस लाने के लिए सामग्री-प्रबंधन-प्रणाली क्षमताओं के बारे में सोचें।
उनके पेशेवरों / विपक्ष क्या हैं?
डेटाबेस प्रविष्टियों (डेटा) के संस्करण की अनुमति देने के तरीके क्या हैं?
लेखों के वापस परिवर्तनों को वापस लाने के लिए सामग्री-प्रबंधन-प्रणाली क्षमताओं के बारे में सोचें।
उनके पेशेवरों / विपक्ष क्या हैं?
जवाबों:
मूल रूप से दो दृष्टिकोण हैं: एक ऑडिट टेबल, जिसमें पिछले सभी मान संग्रहीत हैं, या तालिका के भाग के रूप में एक शुरुआत / समाप्ति तिथि शामिल है, और सभी अपडेट पुराने को बंद करते हुए एक नया रिकॉर्ड बनाते हैं।
अपडेट: SQL SERVER 2016 इसे एक डिज़ाइन पैटर्न / टेबल प्रकार के रूप में समर्थन करता है - https://docs.microsoft.com/en-us/sql/relational-dat डेटाबेस/tables/temporal-tables?view=sql-server- 2017
एक विचार "इन्सर्ट-ओनली डेटाबेस" का उपयोग करना है। मूल विचार यह है कि आप कभी भी एक पंक्ति में डेटा को हटा या अपडेट नहीं करते हैं ।
ट्रैक करने के लिए आवश्यक प्रत्येक तालिका में दो datetime
कॉलम from
और होंगे to
। वे NULL
प्रत्येक में मूल्य के साथ शुरू करते हैं (समय से अंत तक की शुरुआत)। जब आपको उस पंक्ति को "बदलने" की आवश्यकता होती है जिसे आप एक नई पंक्ति जोड़ते हैं, और उसी समय आप to
पिछली पंक्ति में Now
और उस पंक्ति में अपडेट करते हैं जिसे from
आप जोड़ रहे हैं Now
।
अधिक विस्तृत जानकारी के लिए देखें:
इस तकनीक को AuditTrail
विरासत डेटा का प्रबंधन करने के लिए कहा जाता है, और इसके थोड़े स्टोर इतिहास को बदलते हैं।
ऐसा लगता है कि इस प्रकृति का प्रश्न पहले से ही पोस्ट किया गया है:
मुझे लगता है कि आप प्रत्येक तालिका के लिए ट्रिगर का उपयोग कर सकते हैं और _history (या आप कोई भी नाम दे सकते हैं) में डेटा बनाए रख सकते हैं और अपडेट कर सकते हैं, मुख्य टेबल पर हटाएं आपके ट्रिगर को ट्रिगर करेंगे और आप इस तालिका में विवरण सहेज सकते हैं। यदि आप एक का उपयोग कर रहे हैं तो SQLite डेटाबेस के साथ भी उपलब्ध है।
यह तंत्र बड़ी परियोजनाओं के लिए भी उपयोगी है। इस तालिका में आप उन उपयोगकर्ताओं की जानकारी लॉग कर सकते हैं जिन्होंने परिवर्तनों के समय-स्टैंप के साथ बदलाव किए हैं। तब आप अपनी आवश्यकताओं के अनुरूप किसी भी समय-स्टांप को अपनी तालिका को पुनर्स्थापित कर सकते हैं।
प्रत्येक डेटाबेस को ट्रिगर लिखने और कोड करने का अपना तरीका है। यदि आप वाक्यविन्यास के लिए SQLite.org SQLite.org का उपयोग कर रहे हैं । अन्य डेटाबेस के लिए आप उनकी आधिकारिक साइटों पर जा सकते हैं।
आप शायद Sqlite DB इंजन के बारे में जानते हैं । पूरी db एक ही फाइल में सेव होती है। एपीआई वर्चुअल फाइल सिस्टम को भी सपोर्ट करता है इसलिए मूल रूप से आप स्टोरेज को कहीं भी और किसी भी फॉर्मेट में व्यवस्थित कर सकते हैं, बस विशेष फाइल ऑफसेट पर पढ़ने और लिखने के लिए प्रतिक्रिया दें। इसके लिए संभावित अनुप्रयोग एन्क्रिप्शन, संपीड़न और इतने पर हो सकते हैं। इसका सबसे अच्छा हिस्सा यह है कि कंटेनर परत को डेटाबेस, sql या sqlite फ़ाइल प्रारूप के बारे में कुछ भी नहीं पता होना चाहिए, बस xRead और xWrite कॉलबैक का पालन करना चाहिए।
विचारों में से एक टाइम-मशीन सुविधा को लागू करना था। तो कोई भी xWrite ऑपरेशन हर उस खंड को बचाता है जो इसे "पूर्ववत" इतिहास में अधिलेखित कर देगा और उपयोगकर्ता अतीत में एक तिथि चुन सकता है कि इसमें db सम्मिलित है (शायद केवल-पढ़ने के लिए मोड)। मेरे पास अभी तक काम करने का उदाहरण नहीं है ( साइक्लाइट मेल सूची में इसके बारे में चर्चा थी ), लेकिन शायद अन्य इंजन वीएफएस एपीआई की आपूर्ति करते हैं इसलिए ऐसा ही कुछ संभव है। और एक बार इसे लागू करने के बाद, यह किसी भी जटिलता के डेटाबेस संरचनाओं के साथ संगत होना चाहिए।
डेटाबेस प्रविष्टियों को संस्करणित करने के लिए हम जिस विधि का उपयोग करते हैं वह ऑडिटिंग टेबल का उपयोग करना है। तालिका की तर्ज पर एक स्कीमा है:
Seq - Int ' Unique identifier for this table
Event - Char ' Insert / Update / Delete
TblName - Char ' Table that had field value changed
FldName - Char ' Field that was changed
KeyValue - Char ' delimited list of values for fields that make up the PK of table changed
UsrId - Char ' User who made the change
OldValue - Char ' Old value (converted to character)
NewValue - Char ' New value (converted to character)
AddTs - DateTime ' When the change was made
फिर हमारे पास उन तालिकाओं को सम्मिलित / अद्यतन / हटाने पर ट्रिगर होता है जिन्हें हम ट्रैक करना चाहते हैं।
पेशेवरों:
विपक्ष:
मैं अब इसका एक संस्करण कर रहा हूं। हर रिकॉर्ड के लिए मेरे पास एक सम्मिलित तिथि, संशोधित तिथि और सक्रिय रिकॉर्ड बूलियन ध्वज है। प्रारंभिक सम्मिलित सम्मिलित और संशोधित तिथियों के लिए दोनों अभी () में है (यह उदाहरण एक्सेस में है) और सक्रिय रिकॉर्ड ध्वज के लिए सेट है true
। फिर अगर मैं उस रिकॉर्ड को संशोधित करता हूं तो मैं पूरे मामले को एक नए रिकॉर्ड में कॉपी करता हूं, उपयोगकर्ता को बदल रहा है, उपयोगकर्ता बदल रहा है, मैं सम्मिलित दिनांक को मूल के बराबर छोड़ देता हूं और संशोधित तिथि को अब () में बदल देता हूं। मैं तो करने के लिए मूल रिकॉर्ड के सक्रिय रिकॉर्ड झंडा false
और करने के लिए नए रिकॉर्ड फ्लिप true
। मेरे पास ModifiedRecordsParentID के लिए एक फ़ील्ड भी है जहां मैं मूल रिकॉर्ड की पहचान को सहेजता हूं।
तब अगर मुझे क्वेरी करने की आवश्यकता होती है तो मैं केवल रिकॉर्ड वापस कर सकता हूं जहां ActiveRecord = true
और मुझे केवल अधिकतम जानकारी प्राप्त होगी।
ActiveRecord
झंडे की कोई जरूरत नहीं । MAX (*) पंक्ति हमेशा वर्तमान रिकॉर्ड होनी चाहिए। एक पिछले संस्करण के लिए बस आवेषण को बहाल करते हुए कहा कि तालिका में पंक्ति फिर से डालें।
select top 1 order by id descending
करना होगा।
यदि आप समय के साथ DB में सभी परिवर्तनों को संग्रहीत करना चाहते हैं, तो आप लॉगिंग ( /programming/3394132/where-can-i-find-the-mysql-transaction.log पर चेक आउट करना चाह सकते हैं )