मेरी पसंद दृष्टिकोण 2 की भिन्नता होगी। बोल्ड प्राथमिक कुंजी में फ़ील्ड को इंगित करता है।
- आप प्रत्येक लेख को एक तालिका में सम्मिलित करते हैं
articles_versioned
(आईडी , टाइमस्टैम्प , नाम, टेक्स्ट) - आपकी दूसरी तालिका है
articles
(आईडी , टाइमस्टैम्प, [नाम, पाठ])। ध्यान दें कि कैसे टाइमस्टैम्प प्राथमिक नहीं है; नाम और टेक्स्ट को दोहराया जा सकता है, या आपarticles_versioned
. के साथ जुड़ने का उपयोग कर सकते हैं (जो तेज़ होगा क्योंकि आईडी और टाइमस्टैम्पarticles_versioned
. हैं प्राथमिक कुंजी) articles_versioned
डालने पर एक ट्रिगर होता है जो अभी डाली गई पंक्ति लेता है और इसेarticles
. पर दोहराता है- किसी लेख के विशिष्ट संस्करण को पुनर्स्थापित करने के लिए आप
articles
. को संशोधित करते हैं टेबल.
इस दृष्टिकोण के फायदे हैं:
- आपको अपनी तालिका में एक और जानकारी (लेख की तारीख और समय) मुफ्त में मिलती है, जिसकी आपको वैसे भी आवश्यकता हो सकती है
- वर्तमान तिथि प्राप्त करने के लिए आपको डेटाबेस से पूछताछ करने की आवश्यकता नहीं है। यदि आप संस्करण का उपयोग करते हैं, तो आपको करना होगा।
- आपके कोड में आलेख को दो तालिकाओं में सम्मिलित करने की आवश्यकता नहीं है। आप बस
articles_versioned
. में डालें औरarticles
. से पढ़ें , डीबी डेटा को माइग्रेट करने का ख्याल रखता है क्योंकि आप इसे ट्रिगर के माध्यम से डालते हैं, किसी भी स्थिरता की समस्याओं से बचते हैं।
विपक्ष
- अत्यधिक समवर्ती वातावरण में, एक ही समय में दो संस्करण सम्मिलित किए जा सकते हैं, इसलिए उनमें से एक विफल हो सकता है। उपयोगकर्ता-लिखित लेखों को सम्मिलित करते समय यह कोई समस्या नहीं होनी चाहिए (इन दिनों टाइमस्टैम्प की सटीकता को देखते हुए इसकी अत्यधिक संभावना नहीं है)। यदि आप अपने
INSERT
. में टाइमस्टैम्प निर्दिष्ट नहीं करते हैं कथन, लेकिन इसके बजाय आप वर्तमान समय को डिफ़ॉल्ट मान के रूप में रखने के लिए डेटाटाइम फ़ील्ड सेट करते हैं, आप इस समस्या से पूरी तरह बच सकते हैं।
अपने शेष प्रश्न का उत्तर देने के लिए। जब तक आप स्थिति पर एक अनुक्रमणिका जोड़ते हैं, तब तक दृष्टिकोण 1 में लंबी पूछताछ नहीं होगी। यह तभी समझ में आता है जब आपके पास प्रत्येक लेख के कई अलग-अलग संस्करण हों; जब तक आपके पास औसतन या उससे कम पर प्रति लेख 2 संस्करण हैं, सूचकांक केवल आपको धीमा कर देगा, और दृष्टिकोण 2 वैसे भी समझदारी से तेज़ नहीं होगा (हालांकि मैं अभी भी अपने दृष्टिकोण की अनुशंसा करता हूं क्योंकि यह एक संस्करण को पुनर्स्थापित करने के बाद से कोड को सरल बनाता है दो पंक्तियों के लिए स्विचिंग स्थिति की आवश्यकता नहीं है)।
छवियों जैसे संबंधित संसाधनों को एक समान संस्करण का पालन करना चाहिए। मुझे लगता है कि आप उन्हें फाइल सिस्टम पर सहेज रहे हैं; उन्हें उनके वास्तविक नाम से सहेजने के बजाय, एक तालिका का उपयोग करें (id , image_name) प्रत्येक छवि को एक आईडी देने के लिए, फिर छवि को -id-.jpg
के रूप में सहेजें . Image_name फ़ील्ड आपको यह जानने में सक्षम बनाएगी कि मूल फ़ाइल नाम क्या था (यदि आप इसकी परवाह करते हैं)। इस तरह आप छवियों को उसी तरह संस्करणित कर सकते हैं जैसे आप संस्करण लेखों में करते हैं, और लेखों में आप कुछ इस तरह का उपयोग करेंगे <img src="-id-.jpg">
, जिसे आप जानते हैं, हमेशा के लिए उपलब्ध रहेगा।