MySQL डेटाबेस में रिलेशनल डेटा को वर्जन करने के लिए पैटर्न?


12

मैं एक परियोजना के लिए एक दृष्टिकोण खोजने की कोशिश कर रहा हूं, जहां ए उपयोगकर्ता रिकॉर्ड संपादित कर सकता है, और उन रिकॉर्ड के पिछले संस्करणों को देखने में सक्षम हो सकता है। यहाँ एक सूची का उपयोग करके एक नकली उदाहरण स्कीमा दिया गया है:

TABLE list (
  id int auto_increment primary key,
  user_id int, 
  title varchar(255)
);

TABLE list_tasks (
  id int auto_increment primary key,
  list_id int,
  title varchar(255),
  order int,
  is_complete tinyint
);

तो एक उपयोगकर्ता अंदर आ सकता है, और सूची में कई संपादन कर सकता है, (जैसे, कार्यों को जोड़ना या निकालना, कार्यों को फिर से आदेश देना, कुछ पूर्ण को चिह्नित करना, कुछ का नाम बदलना, आदि), फिर उन्हें सहेजें। इस बिंदु पर, मैं सूची और कार्यों का एक 'संस्करण 2' उत्पन्न करना चाहता हूं, और उन्हें पिछले संस्करणों को देखने में सक्षम होना चाहिए, लेकिन जब वे सूची तक पहुंचते हैं, तो हमेशा नवीनतम संस्करण प्राप्त करते हैं।

क्या MySQL डेटाबेस में इस तरह से वर्जनिंग डेटा से निपटने के लिए एक सामान्य तरीका / डिज़ाइन पैटर्न है?


ध्यान दें कि वे इसके लिए पुस्तकालय हैं। उदाहरण के लिए यदि आप हाइबरनेट का उपयोग करते हैं, तो हाइबरनेट एनवर्स है। इसलिए यदि आपके पास DAO को संभालने के लिए कुछ ढांचा है, तो खोज करने का प्रयास करें कि क्या ऐसा कुछ है।
वॉलफ्रैट

जवाबों:


9

यह एक db में चाहते हैं कि बहुत आम है। यद्यपि आप इसमें एक मोड़ डाल रहे हैं कि आप वस्तुओं की सूची के लिए एक संशोधन को ट्रैक करना चाहते हैं।

ऐसा करने का एक तरीका संरचना को बदलना भी हो सकता है

Alter table lists add revision_id integer;
Alter table list_tasks add revision_id integer;

Create Table revisions
{
   id int autoincrement... (revision id)
   list_id int...
   revdate datetime...
}

जब उपयोगकर्ता अपनी सूची को सहेजता है, तो revisionsऊपर दी गई तालिका में एक नया संशोधन बनाएं और उस मूल्य को सूची list_tasksआईडी में निर्दिष्ट करें और फिर listsउस आईडी को 'वर्तमान' संशोधन के रूप में चिह्नित करें। जब उपयोगकर्ता आइटम संपादित करता है, तो मौजूदा आइटम को संपादित न करें - बल्कि, नए संशोधन आईडी के साथ नए डालें और listउस संशोधन के साथ तालिका को अपडेट करें ताकि इसे वर्तमान के रूप में चिह्नित किया जा सके।

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


5

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

प्रत्येक ऑडिट टेबल में निम्नलिखित फ़ील्ड्स जोड़ें:

AddUserID      int <whatever your system uses>
AddDateTime    datetime
UpdateUserID   int <whatever your system uses>
UpdateDateTime datetime
CurrentVersion int
IsDeleted      bit

डेटा परिवर्तन के लिए आपको हर बार इन फ़ील्ड्स को अपडेट करना होगा। CurrentVersion 1 से बढ़ जाता है (इसे किसी रिकॉर्ड को लॉक करने के तरीके के रूप में इस्तेमाल किया जा सकता है, लेकिन यह एक और सवाल है।) IsDeleted एक "सॉफ्ट डिलीट" प्रदान करता है, ताकि इसे भविष्य में संदर्भित किया जा सके।

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

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

मैंने पिछले कुछ वर्षों में इस काम को अच्छी तरह से देखा है। मैं उन कमियों के बारे में सुनना चाहूंगा जिन पर मैं विचार नहीं कर सकता।


मैं इसे और साथ ही GrandMasterB's को अपवोट कर रहा हूं, दोनों अच्छे हैं और जो उपयोग करना है वह विशिष्ट आवश्यकताओं पर अधिक विवरण पर निर्भर करता है।
रद्दी

-2

मेरा सुझाव है कि आप इस विस्तृत लेख को पढ़ें।

https://blog.jondh.me.uk/2011/11/relational-database-versioning-strategies/comment-page-1/#comment-373850

एक अन्य तरीका यह है कि आपके टेबल में एक वर्जन_आईडी कॉलम और एक 'करंट' झंडा है जो यह निर्दिष्ट करता है कि कौन सी पंक्ति वर्तमान है। हर बार जब आपको अपडेट की आवश्यकता होती है, तो आप एक नई पंक्ति सम्मिलित कर सकते हैं और मौजूदा संस्करण 'वर्तमान' ध्वज को 0 / गलत और नई जोड़ी गई पंक्ति को 1 पर सेट कर सकते हैं।

इस तरह आप केवल वर्तमान ध्वज सेट वाले लोगों को दिखाते हुए एक दृश्य बना सकते हैं।

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