2009-03-13 14 views
8

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

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

तो, मैं कॉलम या तालिकाओं को बहिष्कृत करने में सक्षम होने का एक तरीका ढूंढना चाहता हूं। आदर्श मामले में, स्कीमा को अपडेट करते समय बहिष्कृत वस्तुओं को चिह्नित किया जाएगा, लेकिन फिर अगले अपडेट के दौरान हमारी बैकअप स्क्रिप्ट बस उन वस्तुओं को नहीं चुन पाएगी जिन्हें इस तरह चिह्नित किया गया है, जिससे हम अंततः स्कीमा के इन हिस्सों को समाप्त कर सकते हैं ।

मुझे पता चला है कि MySQL (और शायद अन्य डीबी प्लेटफ़ॉर्म भी हैं, लेकिन यह वह है जिसे हम उपयोग कर रहे हैं) दोनों फ़ील्ड और तालिकाओं में COLUMN विशेषता का समर्थन करता है। यह सही होगा, सिवाय इसके कि मैं यह समझ नहीं सकता कि वास्तव में इसे सार्थक तरीके से कैसे उपयोग किया जाए। में सभी कॉलम नाम प्राप्त करने के लिए मैं SQL क्वेरी लिखने के बारे में कैसे जाउंगा, जिसमें "बहिष्कृत" शब्द वाला एक टिप्पणी मिलान करने वाला टेक्स्ट होता है? या क्या मैं इस समस्या को सभी गलत देख रहा हूं, और ऐसा करने के लिए एक बेहतर तरीका याद कर रहा हूं?

+0

मुझे समझ में नहीं आता है कि "हटाए गए कई आइटम वास्तव में दोबारा प्रतिक्रिया किए गए हैं, और कोड में पुराने लोगों की मौजूदगी अन्य प्रोग्रामर को यह सोचने में मूर्ख बनाती है कि वे उनका उपयोग कर सकते हैं।" –

+0

डेल्टा एसक्यूएल स्क्रिप्ट को बनाए रखने और निष्पादित करने के बजाय आप इस प्रक्रिया का पालन क्यों करते हैं? – cherouvim

उत्तर

6

शायद आपको अपनी टेबल पर विचारों का उपयोग करने के लिए रिफैक्टर करना चाहिए, जहां विचारों में कभी भी बहिष्कृत कॉलम शामिल नहीं होते हैं।

+1

+1: डीबी 2 समाधान - केवल आपके अनुप्रयोगों में विचारों का उपयोग करें। –

3

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

मुझे नाम बदलने के अलावा किसी बहिष्कृत कॉलम को "चिह्नित" करने का एक अच्छा तरीका नहीं है, जो चीजों को तोड़ने की संभावना है! यहां तक ​​कि अगर ऐसी सुविधा मौजूद थी, तो वास्तव में इसका कितना उपयोग होगा?

तो क्या आप वास्तव में बहिष्कृत करना या हटाना चाहते हैं? आपके प्रश्न की सामग्री से, मैं बाद वाले का अनुमान लगा रहा हूं।

मुझे बुरा लगा है कि आप उनमें से एक में हो सकते हैं "अगर मैं वहां जाना चाहता हूं तो मैं यहां से शुरू नहीं करूंगा" स्थितियों में से एक में हो सकता है।

  1. पढ़ें Recipes for Continuous Database Integration जो आपकी समस्या क्षेत्र

  2. ड्रॉप स्तंभ स्पष्ट रूप से बहुत पता करने के लिए लगता है: हालांकि, यहाँ कुछ विचार जो मन में वसंत कर रहे हैं। MySQL 5.0 (और इससे पहले भी?) में सुविधा डीडीएल के हिस्से के रूप में मौजूद है: ALTER TABLE वाक्यविन्यास देखें।

  3. देखें कि ActiveRecord::Migration रूबी में कैसे काम करता है। माइग्रेशन में "remove_column" निर्देश शामिल हो सकता है, जो किसी प्लेटफ़ॉर्म-उपयुक्त तरीके से समस्या का सामना करेगा। यह व्यक्तिगत अनुभव से, निश्चित रूप से MySQL के साथ काम करता है।

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

+1

"यहां तक ​​कि अगर ऐसी सुविधा मौजूद थी, तो वास्तव में इसका कितना उपयोग होगा?" आप आश्चर्यचकित हो सकते हैं। मैंने ऐसी परिस्थिति में भाग लिया है जहां मैं * मौजूदा निर्भरताओं के कारण कॉलम का नाम बदल नहीं सकता हूं, लेकिन मुझे क्लाइंट द्वारा इसका नाम बदलने की आवश्यकता है (जो अब अन्य अनुप्रयोगों के लिए डेटा तक पहुंचना चाहता है)। तो मुझे सब कुछ विस्फोट से रखने के लिए प्लेसहोल्डर के रूप में एक प्रतिलिपि छोड़नी पड़ी है। यह वास्तव में अच्छा होगा अगर डेटाबेस किसी भी उपयोगकर्ता पर चेतावनी फेंक सकता है जिसने इसे 'चयन' करने का प्रयास किया था। बहिष्करण के विचार के लिए यह सामान्य उपयोग मामला है: आप अभी तक नहीं हटा सकते हैं, लेकिन आप इसे चरणबद्ध करना शुरू करना चाहते हैं। – jpmc26

+0

आपको कैसा लगेगा यदि आपकी पसंदीदा लाइब्रेरी अचानक आपके द्वारा उपयोग की जाने वाली सुविधा को हटा देती है? वही अवधारणा यहां लागू होती है। कभी-कभी आप इसे बिना किसी जबरदस्त (उर्फ आवेदक) काम के तुरंत हटा सकते हैं। यह समझना महत्वपूर्ण है कि कुछ मुद्दों (उनमें से सभी नहीं) समय के साथ बेहतर ढंग से संबोधित किए जाते हैं। –

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