मुझे उनमें 'DeletedDate' जैसे स्तंभों के साथ तालिका पंक्तियाँ देखने की आदत है और मैं उन्हें पसंद नहीं करता। 'हटाई गई' की धारणा यह है कि प्रविष्टि को पहले स्थान पर नहीं बनाया जाना चाहिए था। व्यावहारिक रूप से, उन्हें डेटाबेस से हटाया नहीं जा सकता है लेकिन मैं उन्हें अपने हॉट डेटा के साथ नहीं चाहता हूं। तार्किक रूप से हटाई गई पंक्तियाँ, परिभाषा के अनुसार, ठंडा डेटा है जब तक कि कोई विशेष रूप से हटाए गए डेटा को नहीं देखना चाहता है।
इसके अलावा, लिखी गई प्रत्येक क्वेरी को विशेष रूप से उन्हें बाहर करना पड़ता है और अनुक्रमित करने के लिए उन पर भी विचार करने की आवश्यकता होती है।
जो मैं देखना चाहता हूं वह डेटाबेस आर्किटेक्चर स्तर और एप्लिकेशन स्तर पर एक बदलाव है: 'हटाए गए' नामक स्कीमा बनाएं। प्रत्येक उपयोगकर्ता-परिभाषित तालिका में मेटाडेटा को रखने वाले अतिरिक्त फ़ील्ड के साथ 'हटाए गए' स्कीमा में एक समान समतुल्य है - उपयोगकर्ता जो इसे हटा दिया और जब। विदेशी कुंजी बनाने की आवश्यकता है।
अगला, डिलीट इन्सर्ट-डिलीट हो जाता है। हटाई जाने वाली पहली पंक्ति को उसके 'हटाए गए' स्कीमा समकक्ष में डाला जाता है। मुख्य तालिका में प्रश्न की पंक्ति को हटाया जा सकता है। हालाँकि, अतिरिक्त तर्क लाइन के साथ कहीं और जोड़े जाने की आवश्यकता है। विदेशी प्रमुख उल्लंघनों को संभाला जा सकता है।
विदेशी चाबियों को ठीक से संभालना होगा। एक पंक्ति को तार्किक रूप से नष्ट करना बुरा है, लेकिन जिसके प्राथमिक / अद्वितीय में अन्य तालिकाओं में कॉलम हैं जो इसे संदर्भित करते हैं। यह वैसे भी नहीं होना चाहिए। एक नियमित नौकरी विधवा पंक्तियों को हटा सकती है (वे पंक्तियाँ जिनकी प्राथमिक कुंजी में विदेशी कुंजी की उपस्थिति के बावजूद अन्य तालिकाओं में कोई संदर्भ नहीं है। यह, हालांकि, व्यावसायिक तर्क है।
समग्र लाभ तालिका में मेटाडेटा की कमी और प्रदर्शन में सुधार लाता है। कॉलम 'डिलीटडैट' कहता है कि यह पंक्ति वास्तव में यहां नहीं होनी चाहिए, लेकिन सुविधा के लिए, हम इसे वहां छोड़ रहे हैं और SQL क्वेरी को इसे संभालने दें। यदि हटाए गए पंक्ति की एक प्रतिलिपि को 'हटाए गए' स्कीमा में रखा जाता है, तो गर्म डेटा के साथ मुख्य तालिका में गर्म डेटा का उच्च प्रतिशत होता है (यह मानते हुए कि यह समय पर फैशन में संग्रहीत है) और कम अनावश्यक मेटाडेटा कॉलम। सूचकांक और प्रश्नों को अब इस क्षेत्र पर विचार करने की आवश्यकता नहीं है। पंक्ति आकार जितना छोटा होगा, उतनी पंक्तियाँ एक पृष्ठ पर फिट की जा सकती हैं, जितना तेज़ SQL सर्वर काम कर सकता है।
मुख्य नुकसान ऑपरेशन का आकार है। अब एक के बजाय दो ऑपरेशन हैं और अतिरिक्त तर्क और त्रुटि से निपटने के लिए। यह एक एकल कॉलम को अपडेट करने की तुलना में अधिक लॉकिंग को जन्म दे सकता है अन्यथा ले जाएगा। लेन-देन लंबे समय तक मेज पर ताले रखता है और इसमें दो टेबल शामिल होते हैं। कम से कम मेरे अनुभव में उत्पादन डेटा हटाना, शायद ही कभी कुछ किया गया हो। अब भी, एक मुख्य टेबल में लगभग 100 मिलियन प्रविष्टियों में से 7.5% में 'DeletedDate' कॉलम में एक प्रविष्टि है।
प्रश्न के उत्तर के रूप में, आवेदन के बारे में पता होना चाहिए। बस इसे उल्टे क्रम में करने की आवश्यकता होगी: मुख्य तालिका में 'हटाए गए' स्कीमा से पंक्ति डालें और फिर 'हटाए गए स्कीमा' से पंक्ति हटाएं। त्रुटियों, विदेशी चाबियों और इस तरह की समस्याओं से बचने के लिए कुछ अतिरिक्त तर्क और त्रुटि से निपटने की आवश्यकता है।