दिलचस्प पोस्ट
जावा में स्ट्रिंग की तुलना और स्ट्रिंग इंटर्निंग आप एक्लिप्स कैसे बढ़ा सकते हैं? एंड्रॉइड पूर्व पॉपुलेटेड डाटाबेस निश्चित चौड़ाई वाले वर्ण तत्वों के एक सदिश में एक स्ट्रिंग काट रहा बूटस्ट्रैप 3 का उपयोग करके चिपचिपा बाएं साइडबार मेनू कैसे बना सकता है? SQL सर्वर में परिणामों को पृष्ठांकित करने का सबसे अच्छा तरीका क्या है जावास्क्रिप्ट jsfiddle.net पर नहीं चल रहा है जावा में अंत में ब्लॉक से लौट रहा है पीसीईआर / पीएचपी में यूनिकोड अक्षर अक्षरों का मिलान करना .htaccess 301 एकल पृष्ठ की रीडायरेक्ट डेक्स निष्पादित करने में असमर्थ: विधि आईडी में नहीं: 65536 संग्रह <टी> बनाम सूची <टी> आप अपने इंटरफेस पर क्या उपयोग करना चाहिए? AsyncTask और Looper.prepare () त्रुटि स्थानीय जीआईटी भंडार बैकअप कैसे करें? सी ++ में ऑब्जेक्ट के प्रकार को ढूंढना

मुलायम एक अच्छा विचार हटाता है?

नरम एक अच्छा विचार या एक बुरा विचार हटाता है?

वास्तव में आपके डेटाबेस में एक रिकार्ड को हटाने के बजाय, आप इसे केवल IsDeleted = true रूप में चिह्नित करेंगे, और रिकार्ड की वसूली पर आप इसे False झंडी False

यह एक अच्छा विचार है?

क्या यह रिकॉर्ड को शारीरिक रूप से हटाए जाने के लिए एक बेहतर विचार है, फिर उसे एक संग्रह डेटाबेस में ले जाएं, और यदि उपयोगकर्ता रिकॉर्ड को वापस चाहता है, तो क्या सॉफ्टवेयर संग्रह में अभिलेख को देखेगा और इसे पुन: बनाएँगे?

वेब के समाधान से एकत्रित समाधान "मुलायम एक अच्छा विचार हटाता है?"

मैं कहता हूं कि यह एक बुरा विचार है, आम तौर पर (कुछ अपवादों के साथ, शायद)

सबसे पहले, आपके डेटाबेस का नियमित रूप से बैकअप होना चाहिए, इसलिए आपको ऐसी स्थिति में कभी नहीं होना चाहिए जहां आप डेली के कारण स्थायी रूप से डेटा खो देंगे (जब तक कि यह अभी-अभी जोड़ा आंकड़ों का विलोपन नहीं होता)।

दूसरा, इस तरह से एक नरम हटाना का अर्थ है कि अब आपको इस तालिका में हर क्वेरी में एक WHERE IsDeleted = false खंड शामिल करना होगा (और यदि आप इन तालिकाओं में शामिल हो रहे हैं तो इससे भी बदतर) यहां एक गलती को पकड़ लिया जाएगा जैसे उपयोगकर्ता या परीक्षक ने फिर से दिखाए गए एक हटाए गए रिकॉर्ड को देखा, जो कुछ समय ले सकता है। साथ ही, डेवलपर के लिए यह आसान होगा कि वे (WHERE) क्लॉज को COUNT (*) प्रश्नों से छोड़ दें, जो कि खोज करने में अधिक समय लग सकता है (मैंने एक प्रोजेक्ट पर काम किया था, जहां यह कई वर्षों से हो रहा था; कई रिकॉर्ड कभी भी "हटाए गए" , इसलिए योगों की अपेक्षा के करीब थे और कोई भी नहीं देखा)।

अंत में, एक नरम हटाना एक कृत्रिम कुंजियों के साथ एक टेबल पर काम करेगा, लेकिन संभावित रूप से एक प्राकृतिक प्राथमिक कुंजी के साथ एक मेज पर काम नहीं करेगा (उदाहरण के लिए, आप किसी एक को सामाजिक सुरक्षा नंबर द्वारा की गई तालिका से "हटाएं" – आप क्या करते हैं जब आप उसे वापस जोड़ने की आवश्यकता है? कृपया "एक मिश्रित प्राथमिक कुंजी में शामिल नहीं है" शामिल नहीं कहें।)।

एक डिजाइन समीक्षा में, मैं उम्मीद करता हूं कि डेवलपर लागत और लाभ के बारे में जागरूकता प्रदर्शित करेगा और इस तरीके से नरम हटाए जाने का एक उत्कृष्ट कारण प्रस्तुत करेगा। "क्यों नहीं ?" एक उत्कृष्ट कारण नहीं है

संभावित डेटा हानि से बचने के लिए यह कभी बुरा विचार नहीं है

मैं हमेशा नरम हटाना ऐसे मामलों में जहां डेटाबेस को एक या अधिक अभिलेखों को साफ़ करना आवश्यक है, मैं आमतौर पर नरम विलोपन की दो-चरण की प्रक्रिया या तो रिकॉर्ड्स को "रीसायकल बिन" या एक दस्तावेज प्रबंधन-शैली के दृष्टिकोण को खाली करता है जहां दस्तावेज़ रिकॉर्ड कर सकते हैं दूर हो जाओ, और फिर हार्ड हटाने से पहले एक अनुमोदन प्रक्रिया के माध्यम से जाना।

यह परिस्थितियों पर निर्भर करता है। मैं उन परिस्थितियों को देख सकता हूं जहां आपको कानूनी रूप से कुछ को वास्तव में हटाने की आवश्यकता होती है। शायद किसी ने अनुरोध किया है कि आपके सामाजिक सुरक्षा नंबर को आपके सिस्टम से स्थायी रूप से निकाल दिया जाए। या हो सकता है कि आपके पास एक डुप्लिकेट रिकॉर्ड है जिसे आप एक रिकॉर्ड में समेकित करना चाहते हैं। नकली ध्वज के साथ चारों ओर लटकने वाले नकली को ध्यान में रखते हुए यह लाभप्रद नहीं हो सकता है

एक तकनीकी नुकसान भी है: आप कैस्केडिंग विलोपन नहीं कर सकते, जो विदेशी कुंजी उल्लंघनों को रोकने के लिए नष्ट किए गए डेटा के किसी भी संदर्भ को स्वचालित रूप से साफ़ कर देता है। यह जरूरी नहीं कि एक बड़ा मुद्दा है, लेकिन यह ध्यान में रखना कुछ है।

अन्यथा, मुझे लगता है कि यह एक अच्छा विचार है

यदि आप नरम विलोपन का उपयोग करने जा रहे हैं, तो is_deleted फ़ील्ड के बजाय, एक deleted_date फ़ील्ड के लिए एक अच्छा विचार है आपको बस बिट फ़ील्ड के बजाय अतिरिक्त डेटा का अच्छा टुकड़ा मिलता है

मुलायम हटाने के लिए एक बड़ी समस्या यह है कि अवांछित डेटा संभावित रूप से डीबी प्रदर्शन को प्रभावित करेगा। कई साल पहले मेरे एक क्लाइंट ने मुझे सभी डेटाबेस आइटम्स पर मुलायम हटाना करने का अनुरोध किया था, मेरा समाधान उन सबको "हटाए गए" आइटम को बैकअप तालिका में ले जाने के बजाय वर्तमान चल रहे तालिकाओं में छोड़ने के लिए है।

यह एक अच्छा विचार है कि कब और यदि कोई अमान्य हटाया गया है तो पूरी तरह से विनाशकारी है और वसूली सरल होना चाहिए। यह भी एक अच्छा विचार है कि यदि आप हमेशा की गई हर चीज़ का ट्रैक रखना चाहते हैं और "हटाएं" का वास्तव में केवल अर्थ है "छिपाना"। मतलब, यह स्थिति पर निर्भर है

सॉफ्ट डिलीट्स भी आपको एप्लिकेशन द्वारा उपयोग किए गए डेटाबेस खाते से DELETE विशेषाधिकारों को रद्द करने की अनुमति देगा।

मैं "इसके बारे में राजनीतिक रूप से सही" होने की कोशिश नहीं करूंगा यदि आप नरम-हटाए जाने की वकालत कर रहे हैं तो आपको मस्तिष्क जांच के लिए जाना चाहिए।

1) सबसे पहले, तालिका में पंक्तियों को नहीं हटाकर आप क्या हासिल कर रहे हैं? सिर्फ तथ्य यह है कि भविष्य में कुछ समय तक आप उन पंक्तियों तक पहुंच सकते हैं, है ना? तो क्यों नहीं सिर्फ एक संग्रह तालिका बनाने और वहाँ पंक्तियाँ स्थानांतरित? उसमे गलत क्या है?

2) सॉफ्ट-डिलीट के साथ आप is_active या कुछ समय-स्टाम्प कॉलम पर क्वेरी पर अनावश्यक क्वेरी बना रहे हैं। यह सिर्फ बेकार है जब आप सरल प्रश्नों को लिखेंगे। हां, यह एक दृश्य के साथ काम करेगा, लेकिन विचार एक अतिरिक्त अनुलग्नक नहीं हैं? प्रत्येक दृश्य एक अतिरिक्त एसक्यूएल, अतिरिक्त प्रदर्शन लागत है, किसी भी वाणिज्यिक आरडीबीएमएस के तहत नीचे सब कुछ केवल एक मेज है इस तथ्य से अलग विचारों के बारे में जादुई बात नहीं है कि आपको तालिकाओं के शीर्ष पर प्रश्नों को कैसे लिखना नहीं आता है

3) हाँ, यह एक व्यू या एमवी के साथ काम करेगा। लेकिन फिर मैंने उत्पादन में पूछताछ की है एफटीएस और सब कुछ अभी भी काम करता है! आधुनिक हार्डवेयर और ठोस सॉफ्टवेयर के चमत्कार लेकिन फिर वह इसे सही नहीं बनाते हैं। तो एक ही तर्क से, सिर्फ इसलिए कि यह काम करता है इसका मतलब यह नहीं कि वह सही है

4) नरम मिटाने की जटिलताएं कभी भी एक साधारण चयन पर रोक नहीं पाती हैं

ए) मान लें कि आपके पास एक अद्वितीय बाधा है। अब आप एक पंक्ति को नरम-हटा दें, लेकिन अद्वितीय बाधा के साथ कॉलम अभी भी वहां है। जब आप उसी डेटा को वापस जोड़ना चाहते हैं, तो आप अतिरिक्त "ट्रिक्स" के बिना ऐसा नहीं कर सकते

बी) आप टेबल ए से टेबल बी जा रहे संगठनों के साथ हो सकते हैं और जब आप टेबल ए से कुछ हटाना चाहते हैं, तो आपको यह सुनिश्चित करने की आवश्यकता है कि टेबल बी पर स्वतंत्र प्रश्नों का ध्यान रखें। मान लें कि एक विशिष्ट विवरण पृष्ठ कुछ detail_id पर काम कर रहा था।

अब एक मास्टर_आईडी नरम हटाई गई है लेकिन आपके पास उस मास्टर_आईड के विस्तार_आईडी के साथ हर जगह कहीं भी प्रचलित है जब आप master_id पर हार्ड डिलीट करते हैं, तो ये विवरण केवल मौजूद नहीं है। अब मुलायम हटाने के साथ वे अब भी मौजूद हैं और उन्हें इस तथ्य से अवगत होना होगा कि उनका master_id सॉफ्ट-डिलीट मोड में है।

यह एक सरल Table_A.is_active = 0 या 1 अवस्था में नहीं रोकेंगे।

5) हार्ड हटाना करना सरल और सही है

ए) किसी को भी कहीं और के बारे में कुछ भी अतिरिक्त या चिंतित नहीं होना चाहिए

  1. आपका आवेदन तर्क सरल है
  2. आपका डेटाबेस छोटा है
  3. आपके प्रश्न तेजी से हैं

बस डेटा + संबंधित टुकड़ों को संग्रहित करें और आपको अच्छा होना चाहिए।

कभी-कभी नरम हटाना आवश्यक होता है उदाहरण के लिए, कहें कि आपके पास एक इनवॉइस टेबल है जो उत्पाद तालिका का संदर्भ देता है एक विशिष्ट उत्पाद के साथ एक चालान बना लेने के बाद आप उस उत्पाद को कभी भी हटा नहीं सकते (और यदि आपका आरआई ठीक से सेट है तो यह आपको नहीं दूँगा)।

यह विशेष परिदृश्य मानता है कि आप इनवॉइस को कभी नहीं हटाना चाहते हैं, जो वास्तविक कंपनी में आप शायद ऐतिहासिक वित्तीय डेटा को नहीं हटाना चाहते।

हालांकि कई अन्य मामले हैं, जहां आप कुछ डेटा को किसी निर्भरता के साइड इफेक्ट के रूप में नहीं हटा पाएंगे, क्योंकि श्रृंखला को व्यवसाय या अन्य कारणों से नहीं हटाया जा रहा है।

यह डेटा पर निर्भर करता है कानूनी / लेखा परीक्षा आवश्यकताओं के कारण कुछ डेटा हटाए नहीं जा सकते

दूसरी ओर सोशल नेटवर्किंग साइटें संपर्क जानकारी, फोटो, संदेश इत्यादि समेत सभी संबंधित डेटा के साथ एक खाते को हटाने का विकल्प प्रदान करनी चाहिए । यदि वे ऐसा नहीं करते हैं तो यह एक वास्तविक झुंझलाहट है, जैसे कि फेसबुक।

ओरेकल में, यदि आप एक रीसायकल_बिन टेबल बनाने के लिए प्राथमिक कुंजी जोड़ते हैं, तो एक पंक्ति स्तर की सुरक्षा नीति जोड़ते हैं, तो आप रीसायकल बिन में पंक्ति को रीसायकल बिन में निकालते समय सभी प्रश्नों से मानों को दबा सकते हैं, रीसायकल बिन से पीके निकाल देंगे स्वचालित रूप से सभी डेटा को पुनर्स्थापित करें तर्क को समायोजित करने के लिए आपके अन्य प्रश्नों को बदलने की आवश्यकता नहीं है।

यह लागत के साथ आता है, हालांकि, क्योंकि आपको अपने प्रश्नों और अनुक्रमणिका को हटाए गए पंक्तियों को बाहर करने में सक्षम होने की आवश्यकता है।

शायद एक ध्वज को टॉगल करने के बजाय, इसे किसी अन्य "कचरा कैन" तालिका पर ले जाएं।

इसके अलावा, कोई यह कह सकता है कि केवल एक आंशिक समाधान है, क्योंकि यह केवल हटाता है, लेकिन जब आप किसी पंक्ति को अपडेट करते हैं, तो आप अभी भी पुराने मान को ओवरराइट कर रहे हैं।

सामान्य तौर पर, मैं कहता हूं कि जब तक आपको वास्तव में कुछ भी न हो, तब तक कुछ भी मिटाना नहीं। डिस्क स्थान इन दिनों सस्ता है। बेशक, वहाँ सीमाएं हैं, डेटा है कि आप कानूनी रूप से मिटाने के लिए बाध्य हैं, डेटा है जो वास्तव में सभी महत्वपूर्ण नहीं है, और शायद आपको पुरानी डेटा को ऑनलाइन और उसी तालिका में रखने की आवश्यकता नहीं है (कहीं एक संग्रह है भी काम करेगा)।

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

इसके अलावा, अधिकांश वर्कफ़्लो आधारित अनुप्रयोगों में, यह एक सॉफ़्टवेयर सुविधा / आवश्यकता के रूप में आता है जिसे ग्राहक कार्य आइटम पर किए गए "कार्यों" में रुचि रखता है; कौन से मूल्यों को सौंपा गया और किसने इसे संसाधित किया, आदि

मैं नरम हटाने वाला एक प्रशंसक हूं मुख्यतः कैस्केडिंग हटाए जाने को रोकने के लिए हालांकि, यह अतिरिक्त कोड लेता है ताकि यदि आप बाल ऑब्जेक्ट का चयन कर रहे हों, तो यह सुनिश्चित करने के लिए कि उनमें से कोई भी हटाए गए हैं, माता-पिता (और सभी माता पिता!) ऑब्जेक्ट में शामिल हो जाएंगे वैकल्पिक रूप से आप नरम-हटाए गए कैस्केड कर सकते हैं, लेकिन यदि आप उन्हें बाद में पुनर्स्थापित करना चाहते हैं, तो संभवतः आपको पता नहीं हो सकता कि कौन-से बच्चों को पहले से हटा दिया गया है और कैस्केड के कारण हटाए गए थे।

इसके अतिरिक्त, मैं प्रत्येक ऑब्जेक्ट पर एक संशोधन दिनांक समय और संशोधन उपयोगकर्ता नाम रखता हूं, ताकि मुझे पता चले कि अंतिम बार कौन संशोधित (या नरम-हटाया गया) फिर ऑडिट ट्रेल के लिए, मैं एक * इतिहास (जैसे ग्राहक इतिहास) तालिका बनाता हूं जो प्रत्येक अद्यतन के बाद मूल तालिका में डाली जाती है। इस तरह ऑब्जेक्ट को संशोधित या सॉफ्ट-डिलीट किए जाने के बाद, मेरे पास एक रिकॉर्ड है कि किसने कार्रवाई की और साथ ही ऑब्जेक्ट की अंतिम ज्ञात अवस्था

मैं निम्नलिखित व्यापक परिदृश्यों के लिए नरम-हटाना का सामना करना पड़ा:

मामले 1: उपयोगकर्ता / कोड को दिखाई देने से रिकॉर्ड को हटा दें, लेकिन डीबी स्तर पर रिकॉर्ड होने के बाद से व्यापार को यह जानने में रुचि है कि यह रिकॉर्ड था।
ये आवश्यकताएं ज्यादातर व्यवसाय द्वारा संचालित होती हैं और आमतौर पर कोर में संभवतः एक कानूनी आवश्यकता होती है (जैसे, जोश्रेरी और @armandino परिदृश्य) डेटाबेस में पिछला रिकॉर्ड रखने के लिए और किए गए प्रत्येक परिवर्तन के लिए एक नया रिकॉर्ड बनाते हैं। इस बिंदु पर, मैं मामले 2 को देखता हूं और मूल्यांकन करता हूं कि क्या यह एक IsDeleted ध्वज होने से पहले आवश्यकताओं को पूरा करता है

मामले 2: एक रिकॉर्ड के विकास का ट्रैक रखने के लिए ऑडिट ट्रेल्स – एक डेटाबेस में रिकॉर्ड के ऑडिट ट्रेल्स रखने के लिए कई अच्छे लेख ऑनलाइन हैं

HTH।