2009-02-03 15 views
11

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

हालांकि, आजकल यह वास्तव में कुछ भी हटाने के लिए लगभग वर्जित है। आप इसे हटाए गए के रूप में चिह्नित करते हैं और इसे दिखाना बंद कर देते हैं। दुर्भाग्यवश, मैं निर्भर रिकॉर्ड होने पर ऐसा करने के लिए ठोस समाधान नहीं ढूंढ पाया है। मैंने हमेशा नरम हटाए गए जटिल वेब को मैन्युअल रूप से कोड किया है।

क्या वहां कोई बेहतर समाधान है कि मैंने पूरी तरह याद किया है?

उत्तर

13

मुझे यह कहने से नफरत है लेकिन ट्रिगर्स विशेष रूप से इस तरह की चीज़ के लिए डिज़ाइन किए गए हैं।

(अभद्र हिस्सा है क्योंकि अच्छा चलाता बहुत लिखने के लिए कड़ी मेहनत कर रहे हैं और, ज़ाहिर है, डिबग नहीं किया जा सकता)

0

सुनिश्चित नहीं हैं कि बैकेंड आप के बारे में बात कर रहे हैं, लेकिन आप अपने "हटाएँ झंडा" पर पिक कर सकता एक ट्रिगर का उपयोग करके परिवर्तन को बदलना और कैस्केड करना।

6

विदेशी कुंजी बाधाएं कैस्केड अपडेट कर सकती हैं। यदि आपने अपनी टेबल को कुंजी और डिलीट फ्लैग दोनों से लिंक किया है, तो जब मास्टर टेबल में डिलीट फ्लैग बदल जाता है, तो वह परिवर्तन विस्तार तालिका में फैल जाएगा। मैंने कोशिश नहीं की है, लेकिन यह काम करना चाहिए।

+0

यह बेहद सुरुचिपूर्ण आईएमओ है। ऐसा करने में एकमात्र समस्या यह है कि आप एक NULL Delete_Date का उपयोग नहीं कर सकते हैं, बल्कि इसके बजाय '99 99-12-31' जैसी कुछ मनमाने ढंग से तारीख का उपयोग करना होगा। – HaxElit

+1

थोड़ा और सोचने के बाद यह काम नहीं करता है क्योंकि यदि आप एक निर्भर रिकॉर्ड को नरम हटाते हैं तो आपको एक महत्वपूर्ण बाधा त्रुटि मिलती है क्योंकि माता-पिता की डिलीट तिथि अलग होती है। सच होने के लिए अच्छा लगता है मुझे लगता है;) – HaxElit

2

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

सबकुछ की तरह, हालांकि, यह आपके मॉडल पर निर्भर करता है।

+0

हम्म, लेकिन फिर आपके पास तुरंत बिना देखे गए पंक्तियों से भरा डेटाबेस है जिसका उपयोग किया जाता है - है ना? आप प्राथमिक तालिका में शामिल हो सकते हैं, लेकिन यदि कैस्केड कई स्तरों को गहरा कर देता है, तो यह गन्दा हो सकता है। या क्या मैं कुछ न कुछ भूल रहा हूं? – Piskvor

+1

यह मॉडल पर निर्भर करता है। एक रिलेशनल डिज़ाइन में, यदि एक हटाया गया ध्वज संबंध/tuple/table में नहीं है - यानी यह कुंजी की विशेषता नहीं है, तो मैं एक नहीं रखूंगा। एक स्टार स्कीमा में - आप उन्हें केवल कोर टेबल पर रखेंगे। –

+0

यदि आप उपप्रणाली की एक स्कीमा का उदाहरण देते हैं, तो मैं आपको दिखाऊंगा कि मैं कौन से हटाए गए ध्वज को हटा दूंगा। उदाहरण के लिए, उदाहरण के लिए, जब तक आप लिंक बदलने के इतिहास को नहीं रखते हैं, तब तक उन्हें कई से अधिक टेबल पर नहीं रखा जाएगा, इस मामले में, आपको प्रभावी तिथियां भी जोड़नी होंगी। –

संबंधित मुद्दे