2011-10-19 20 views
8

यह एक विशिष्ट प्रश्न नहीं है, एक सामान्य सोच है।दुविधा: कैस्केड हटाएं या हटाएं

जब आपको 1: एम रिलेशनशिप में एकाधिक तालिकाओं पर डिलीट करना होता है, तो क्या यह एक कैस्केड डिलीट के साथ एफके बाधा को हटाने या हटाने के कथन में तालिकाओं में शामिल होना बेहतर होता है।

मेरे पास एक पुरानी परियोजना थी जिसमें संबंधित तालिकाओं के लिए अलग-अलग डिलीट स्टेटमेंट थे, और कुछ बार कुछ कथनों को निष्पादित नहीं किया गया था और डेटा अखंडता से समझौता किया गया था। मुझे दोनों के बीच फैसला करना पड़ा, इसलिए मैं थोड़ा सोच रहा था कि एक बेहतर समाधान क्या होगा।

संग्रहित प्रक्रिया या लेनदेन करने का विकल्प भी है।

तो मैं एक राय या सलाह ढूंढ रहा हूं ...?

उत्तर

4

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

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

जैसा कि पहले से ही उल्लेख किया गया है, कैस्केडिंग ट्रिगर्स को उन पंक्तियों को हटाने का खतरा होता है जिन्हें कोई हटाना नहीं चाहता था। इस बात पर विचार करें कि कभी-कभी लोग आपके आवेदन के बाहर कहीं से भी आपके डेटा तक पहुंच सकते हैं, खासकर जब डेटा समस्याओं को ठीक करते हैं। जब कोई गलती से गलत माता-पिता को हटाने की कोशिश करता है और एक अच्छा त्रुटि प्राप्त करता है जो अच्छा है। जब वे गलती से गलत माता-पिता को हटाने की कोशिश करते हैं और यह न केवल उस माता-पिता को हटा देता है बल्कि 5 अन्य टेबलों में 20 बच्चे, यह बुरा है।

इसके अलावा, कैस्केडिंग डिलीट बहुत छिपे हुए हैं। यदि कोई डेवलपर माता-पिता के लिए डिलीट कोड कर रहा है तो उन्हें पता होना चाहिए कि उन्हें बच्चों की देखभाल करने के लिए हटाए गए संग्रहीत प्रक्रिया का उपयोग करना होगा।डेवलपर को इसके खिलाफ कोड नहीं होना चाहिए, एक त्रुटि प्राप्त करें, और उसके कोड को ठीक करें (या महसूस करें कि वह वास्तव में उस सभी को हटाना नहीं चाहता है) एक डेवलपर को डिलीट में फेंकना है और उसके पास है कोई भी एहसास नहीं करता कि यह कोड बंद होने तक बच्चों को मार रहा है।

आईएमओ, मैं अपने डेवलपर्स को एप्लिकेशन के बारे में जानकार होना पसंद करता हूं बल्कि उनके लिए अनजान रहना आसान बनाता है।

7

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

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

+0

पूरी तरह से। महान जवाब और अच्छी तरह से रखा। डेटा इंटीग्रटी को हमेशा बहुत कम ध्यान मिल गया है और आम तौर पर लाइन के नीचे कुछ वर्षों तक पॉप-अप करना शुरू होता है और अक्सर कई कंपनियों को परेशान करता है - वे डेटा संग्रह के बारे में बहुत पहले बुरे फैसले के कारण अब नवाचार और परिवर्तन नहीं कर सकते हैं। –

+0

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

4

कैस्केड हटाएं कई मुद्दों का कारण बनता है और इस प्रकार यह बेहद खतरनाक है। मैं इसके उपयोग की सिफारिश नहीं करता। सबसे पहले, मान लीजिए मुझे रिकॉर्ड को हटाना होगा जिसमें लाखों बच्चे रिकॉर्ड हैं। आप डेटाबेस को लॉक कर सकते हैं और इसे घंटों तक अनुपयोगी बना सकते हैं। मैं बहुत कम dbas के बारे में जानता हूं जो अपने डेटाबेस में कैस्केड हटाने के लिए अनुमति देगा।

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

0

दोनों का उपयोग करें!

"शामिल" मैनुअल डेलेट आमतौर पर डेडलॉक्स और अन्य विवाद समस्याओं से बचने के लिए बेहतर होते हैं क्योंकि आप काम की छोटी इकाइयों में हटा सकते हैं। यदि आपके पास विवाद का कारण खोजने के लिए विवाद है तो यह निश्चित रूप से आसान है।

जैसा कि "हटाएं कैस्केड" पूरी तरह से रेफरेंसियल अखंडता की गारंटी देगा।

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

+0

कोई विदेशी कुंजी रेफरेंसियल अखंडता की गारंटी देता है –

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