डेटाबेस स्कीमा से निपटने के लिए कुशल तरीके क्या हैं जो कोड शाखाओं के बीच साझा किए जाते हैं?


12

कई शाखाओं के साथ एक परियोजना पर काम करना, जहां प्रत्येक शाखा को अंततः मुख्य शाखा में वापस मिला दिया जाता है, और नई सुविधा विकसित करने के लिए संक्षेप में अलग किया जाता है।

डेटाबेस, जो एमएस SQL ​​सर्वर है, में एक साझा स्कीमा है, हालांकि प्रत्येक शाखा स्कीमा में परिवर्तन करती है क्योंकि यह आगे बढ़ता है।

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


2
बस विलय को किसी अन्य कोड की तरह संभाला जाना चाहिए: स्वचालित विलय, उपयोगकर्ता के हस्तक्षेप के साथ, और निरीक्षण / परिणाम का परीक्षण। (मैं जिस तरह से VS डेटाबेस प्रोजेक्ट स्कीमा को प्रति फ़ाइल एक ऑब्जेक्ट के साथ संभालता हूं।)। मुश्किल सा मौजूदा डेटाबेस काम की ;-) कैसे आगे माइग्रेशन के साथ आता है

2
यह बहुत हद तक इस बात पर निर्भर करता है कि आप स्कीमा कैसे बना रहे हैं। क्या आप बेस ऑब्जेक्ट्स के लिए स्क्रिप्ट बनाने के साथ-साथ स्क्रिप्ट को बदलने के लिए स्टोर कर रहे हैं? क्या आप संस्करणों के बीच माइग्रेट करने के लिए स्क्रिप्ट को बदलने के लिए स्कीमा तुलना टूल का उपयोग कर रहे हैं? VS2010 डेटाबेस प्रोजेक्ट्स?
मार्क स्टोरी-स्मिथ

प्रासंगिक चर्चा: dba.stackexchange.com/questions/2/…
निक चामास

1
इसके अलावा प्रासंगिक: martinfowler.com/articles/…
निक चामास

जवाबों:


7

मैंने निम्नलिखित कार्यप्रणाली का सफलतापूर्वक उपयोग किया है, जो संस्करण नियंत्रण और आपके डेटाबेस में विस्तृत है :

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

मैं अक्सर 'कैसे स्रोत नियंत्रण के तहत वस्तु परिभाषा स्क्रिप्ट रखने से अलग है?' की राय सुनते हैं। अंतर बहुत बड़ा है, क्योंकि जब आप अपने ऐप के नए संस्करण को तैनात करते हैं तो आप बस एक नया डेटाबेस नहीं बनाते हैं। अधिकांश बार आपके ऐप को मौजूदा डेटा सहित मौजूदा डेटाबेस को अपग्रेड करना होगा । यह एक महत्वपूर्ण अंतर है, अपग्रेड के दौरान मौजूदा डेटा की अखंडता और स्थिरता सुनिश्चित करने के लिए आपके अपग्रेड चरणों की आवश्यकता होती है। कुछ ऑपरेशन कोड में तुच्छ होते हैं (तालिका ऑब्जेक्ट डेफिनिशन स्क्रिप्ट के लिए डिफ़ॉल्ट मान के साथ एक गैर-अशक्त स्तंभ जोड़ें), लेकिन वे वास्तव में वास्तविक तैनाती पर बेहद दर्दनाक हैं (तालिका में 1.5 बिलियन पंक्तियाँ हैं, ऐड कॉलम बाहर चला जाएगा लॉग का स्थान अगर 'सिंपल' तरीके से किया जाता है)।

यह ब्रांचिंग के साथ कैसे काम करता है:

  • जब शाखा बनाई जाती है, तो यह वर्तमान स्कीमा संस्करण को स्नैप करता है, संस्करण 1.6 कहता है
  • जैसे ही टीम शाखा पर काम करना शुरू करती है, यह एक नया संस्करण, 1.7 जोड़ता है, और फिर यह 1.6 से 1.7 तक उन्नयन कदम को कोड करना शुरू कर देता है
  • उन्नयन कदम के रूप में बदल जाता है के रूप में शाखा में संशोधन किया जाता है। यह हमेशा स्क्रिप्ट चलाता है जो v 1.6 से 1.7 में अपग्रेड करता है, लेकिन वास्तव में वे स्क्रिप्ट क्या करते हैं, शाखा में सामान्य कोड पुनरावृत्तियों और चेक-इन के अधीन है।
  • शाखा विकास को पूरा करती है, यह रिवर्स इंटीग्रेशन (बेसलाइन में वापस मर्ज होने के लिए) तैयार करती है
    • यह आधार रेखा से शाखा तक एक नया अग्रगामी एकीकरण करता है। यदि एकीकरण स्कीमा संस्करण में कोई परिवर्तन नहीं लाता है, तो सभी चीजें अच्छी होती हैं, शाखा एकीकृत के रूप में रिवर्स कर सकती है। संस्करण 1.7 नया बेसलाइन संस्करण बन जाता है।
    • दिलचस्प बात यह है कि इस बीच एक अन्य शाखा ने आधार को एकीकृत कर दिया है और अब आधार स्कीमा संस्करण 1.7 में बदल गया है। इस मामले में हमारी शाखा को 1.8 से तैनाती लक्ष्य स्कीमा संस्करण को टक्कर देना है और नवीनीकरण के चरण की समीक्षा करना है जो पूर्व में 1.6 से 1.7 तक था यह देखने के लिए कि यह नए वातावरण में कैसे संचालित होता है, 1.7 से 1.8 तक उन्नयन। तार्किक स्कीमा संघर्षों को हल करना होगा, स्क्रिप्ट में बदलाव की आवश्यकता हो सकती है, परीक्षण करना होगा। एक बार पूरा हो जाने पर, शाखा आधार में एकीकृत हो सकती है। उत्पाद का नियोजित लक्ष्य संस्करण अब 1.8 हो गया है।
    • जब स्कीमा संस्करण 1.6 में कांटे की दूसरी शाखा रिवर्स-इंटीग्रेट करना चाहती है, तो उसे स्कीमा संस्करण 1.9 पर टक्कर देनी होगी, अपग्रेड स्क्रिप्ट का 1.8 से 1.9 परीक्षण करना होगा, फिर इसे वापस आधार में एकीकृत कर सकते हैं।

ध्यान दें कि इसमें कोई उपकरण शामिल नहीं है, कोई जादू स्कीमा अलग स्क्रिप्टिंग नहीं, कोई जादूगरों और कोई राइट-बटन-क्लिक-जनरेट-स्क्रिप्ट शामिल नहीं है। यह एक 100% डेवलपर संचालित प्रक्रिया है, जो स्रोत (स्क्रिप्ट) पर आधारित है। कई इस पूरी प्रक्रिया को विस्तृत पाते हैं, लेकिन यह काम करता है। वास्तव में, SQL सर्वर उपयोगकर्ता के रूप में, आप पहले से ही SQL सर्वर के अपने दैनिक उपयोग में इस प्रक्रिया के परिणामों का लाभ उठा चुके हैं: SQL सर्वर स्वयं एक बहुत ही समान डेटाबेस अपग्रेड प्रक्रिया का उपयोग करता है और, जैसा कि आप शायद उम्मीद करते हैं, उत्पाद विकास प्रक्रिया व्यापक उपयोग करती है ब्रांचिंग और आपके द्वारा बताई गई समस्या एक बहुत ही वास्तविक समस्या है जिसे हल करना होगा।

BTW, कैसे ब्रांचिंग / एकीकरण वास्तव में स्रोत नियंत्रण उत्पादों के बीच भिन्न होता है, मैं ऑपरेशन के एकीकृत एकीकृत मोड से परिचित शब्दों का उपयोग कर रहा हूं ।


+1, विशेष रूप से प्रत्येक परिवर्तन के
a_horse_with_no_name

1

हालांकि मेरा जवाब रेमस के रूप में लंबा नहीं हो सकता है, मैंने पाया कि यह वास्तव में एक अच्छा समाधान है। मैंने इसे अभी तक उत्पादन में स्थापित नहीं किया है, इसलिए YMMV *।

Liquibase

मूलतः यह एक XML फ़ाइल है जहाँ आप XML फ़ाइल के अंदर नए तत्वों के रूप में अपने डेटाबेस में स्कीमा परिवर्तन करते हैं। उदाहरण के लिए:

<createTable tableName="department">
            <column name="id" type="int">
                <constraints primaryKey="true" nullable="false"/>
            </column>

यह एक पूरी तरह से बाहर सिक्सैक्स है ताकि आप अपने डेटाबेस के लिए बहुत कुछ कर सकते हैं।

आप अपने लिलीबेस इंस्टॉलेशन में यह भी निर्दिष्ट करते हैं कि आप किस डेटाबेस में वर्जनिंग करना चाहते हैं। फिर आप शामिल जावा एक्ज़ीक्यूटेबल (जार फ़ाइल) के साथ .xml को "रन" करें। यह अनिवार्य रूप से XML में निर्दिष्ट उन परिवर्तनों को आपके डेटाबेस में पुन: बनाता है।

असली किकर यह है कि आप इस एक्सएमएल फाइल को अपने कोड के समान वर्जन वाले फोल्डर में स्टोर करें। तो मेरे उदाहरण में वह था Git। मेरे प्रोजेक्ट फ़ोल्डर में यह XML फ़ाइल थी (जैसा कि /.it के समान स्तर) और फिर जब भी मैंने शाखाएँ बदलीं, XML फ़ाइल उस शाखा संस्करण में बदल जाएगी और मैं .jar फ़ाइल चलाऊंगा और मेरा डेटाबेस अब उस शाखा को प्रतिबिंबित करेगा।

* नोट: मैंने कार्यान्वयन को समाप्त नहीं किया है क्योंकि मुझे जावा को SQL सर्वर से कनेक्ट करने में समस्या थी। कुछ jdbc ड्राइवरों की जरूरत है और ऐसे मैं मूड में नहीं था। इसलिए, आपका लाभ भिन्न हो सकता है।


1

यहां लाल गेट पर हम जल्द ही एक डेटाबेस संस्करण समाधान जारी कर रहे हैं जो SQL तुलना और SQL स्रोत नियंत्रण दोनों का लाभ उठाता है। यह एक माइग्रेशन स्क्रिप्ट अपग्रेड अप्रोच का उपयोग करता है और डेटाबेस को एक वर्जन विस्तारित प्रॉपर्टी के साथ स्टैम्प करता है जो कि सोर्स कंट्रोल रिवीजन से मेल खाता है।

हम दिसंबर के मध्य में रिलीज होने की उम्मीद कर रहे हैं। अब एक रिलीज उम्मीदवार उपलब्ध है। ज्यादा जानकारी के लिये पधारें:

http://www.red-gate.com/products/sql-development/sql-source-control/entrypage/migration

हम आने वाले महीनों में इस समाधान के निर्माण की उम्मीद कर रहे हैं तो कृपया हमें बताएं कि आप क्या सोचते हैं।


0

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


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

माना। यहां रेड गेट पर हमारा मानना ​​है कि निर्माण स्क्रिप्ट बहुत अच्छी तरह से विलय हो जाएगी और स्वचालित हो सकती है। हालांकि, गलत निर्भरता क्रम और परिवर्तन कोड के दोहराव से बचने के लिए संस्करणों के बीच माइग्रेशन स्क्रिप्ट को हाथ से विलय करना होगा।
डेविड एटकिन्सन

0

मैं ऐसी ही स्थिति में हूं जहां मैं एक लाइव वेबसाइट और कई विकास शाखाओं पर काम करता हूं जिसमें मुझे डेटाबेस स्कीमा को बदलने की आवश्यकता होती है।

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

git checkout

या ए

git merge

git स्वचालित रूप से उपयुक्त अप और डाउन-माइग्रेशन को कॉल करेगा। गितुब पर मेरा कार्यान्वयन देखें ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.