2008-08-27 14 views
32

ऐसा लगता है कि यह एक अनदेखा क्षेत्र है जो वास्तव में कुछ अंतर्दृष्टि का उपयोग कर सकता है। एक उन्नत प्रक्रिया आप उत्पादन डेटाबेस में स्कीमा अपग्रेड कैसे प्रबंधित करते हैं?

  • बनाने

    • त्रुटियों
    • कोड और डेटाबेस सिंक कर रहा है के मामले में बाहर समर्थन परिवर्तन
    • तैनाती से पहले तालिका
    • को संशोधित करने की
    • यांत्रिकी परीक्षण: के लिए अपने सर्वोत्तम प्रथाओं क्या हैं

    आदि ...

  • +0

    मैं वहाँ नहीं अधिक जवाब यहाँ हैं हैरान हूँ - शायद विशिष्ट ओरेकल या sqlserver टैग जरूरत है? –

    +0

    अच्छा विचार, धन्यवाद! –

    उत्तर

    3

    यह एक अच्छा सवाल है। (वहाँ एक उच्च मौका इस denormalised डेटाबेस बनाम एक सामान्यीकृत debate..which मैं शुरू करने के लिए नहीं जा रहा हूँ खत्म करने जा रहा है कुछ इनपुट के लिए अब है ... ठीक है।)

    मेरे सिर चीजों के ऊपर से कुछ मैं किया है (जब मेरे पास कुछ और समय होगा या ब्रेक की आवश्यकता होगी)

    क्लाइंट डिज़ाइन - यह वह जगह है जहां इनलाइन एसक्यूएल (यहां तक ​​कि तैयार बयानों के साथ) की वीबी विधि आपको परेशानी में डाल देती है। आप केवल उन बयानों को ढूंढकर एजीईएस खर्च कर सकते हैं। यदि आप हाइबरनेट की तरह कुछ उपयोग करते हैं और नामित प्रश्नों में जितना अधिक एसक्यूएल डालते हैं तो आपके पास अधिकांश एसक्यूएल के लिए एक ही जगह है (कुछ आईएफ स्टेटमेंट के अंदर एसक्यूएल का परीक्षण करने की कोशिश करने से भी कुछ भी बुरा नहीं है और आप बस "ट्रिगर" IF कथन के लिए आपके परीक्षण में मानदंड)। जब मैं सीधे जेडीबीसी या ओडीबीसी में एसक्यूएल करता हूं तो हाइबरनेट (या अन्य ऑर्म्स ') का उपयोग करने से पहले मैं सभी एसक्यूएल स्टेटमेंट्स को किसी ऑब्जेक्ट के सार्वजनिक फ़ील्ड्स (नामकरण सम्मेलन के साथ) या किसी प्रॉपर्टी फ़ाइल में रखता हूं (नामकरण के साथ मानों के लिए सम्मेलन PREP_STMT_xxxx कहता है। और किसी भी में स्टार्टअप पर मूल्यों पर प्रतिबिंब या पुनरावृत्ति का उपयोग करें) परीक्षण मामलों बी) आवेदन की स्टार्टअप (कुछ rdbms आपको निष्पादन से पहले तैयार बयानों के साथ पूर्व-संकलन करने की अनुमति देते हैं, इसलिए स्टार्टअप पोस्ट लॉगिन I पर एप्लिकेशन स्वयं परीक्षण करने के लिए स्टार्टअप पर प्री-स्टैम्स को पूर्व-संकलित करेगा। यहां तक ​​कि केवल कुछ सेकंड्स के लिए एक अच्छा rdbms पर 100 के बयान के लिए। और केवल एक बार। और यह मेरे बट को बहुत बचा लिया है।एक परियोजना पर डीबीए संवाद नहीं करेगा (एक अलग देश में, एक अलग टीम) और स्कीमा किसी भी कारण से रात में बदलना प्रतीत होता था। और हर सुबह हमें स्टार्टअप पर एप्लिकेशन को तोड़ने की बिल्कुल एक सूची मिली।

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

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

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

    स्कीमा में परिवर्तन का प्रबंधन -> क्या आप तालिका को अद्यतन करते हैं या नई तालिकाओं में 1-1 संबंध जोड़ते हैं? मैंने कई दुकानों को देखा है जो इस कारण से हमेशा एक दृश्य के माध्यम से डेटा तक पहुंचते हैं। यह टेबल नामों को बदलने, कॉलम इत्यादि की अनुमति देता है। मैंने वास्तव में COM में इंटरफेस जैसे विचारों का इलाज करने के विचार के साथ खेला है। अर्थात। आप नई कार्यक्षमता/संस्करणों के लिए एक नया दृश्य जोड़ते हैं। अक्सर, आपको यहां क्या मिलता है कि आप बहुत सारी रिपोर्ट (विशेष रूप से अंतिम उपयोगकर्ता कस्टम रिपोर्ट) प्राप्त कर सकते हैं जो तालिका स्वरूप मानते हैं। विचार आपको एक नया टेबल प्रारूप तैनात करने की अनुमति देते हैं लेकिन मौजूदा क्लाइंट ऐप्स का समर्थन करते हैं (उन सभी अजीब adhoc रिपोर्ट याद रखें)।

    इसके अलावा, अद्यतन और रोलबैक स्क्रिप्ट लिखने की आवश्यकता है। और फिर टेस्ट, टेस्ट, टेस्ट ...

    ------------ ठीक है - यह एक बिट रैंडम डिसस्क्यूशन समय है --------------

    वास्तव में एक बड़ी वाणिज्यिक परियोजना (यानी सॉफ्टवेयर शॉप) थी जहां हमें एक ही समस्या थी। आर्किटेक्चर एक 2 स्तर था और वे एक उत्पाद का उपयोग PHP की तरह थोड़ा लेकिन प्री-पीएचपी कर रहे थे। वही चीज। अलग नाम वैसे भी मैं संस्करण 2 में आया था ....

    इसे अपग्रेड करने के लिए धन की बहुत कम लागत थी। बहुत। अर्थात। साइट पर मुफ्त परामर्श समय के हफ्तों दें।

    और यह नई सुविधाओं को जोड़ने या कोड को अनुकूलित करने के इच्छुक होने के बिंदु पर पहुंच रहा था। मौजूदा कोड में से कुछ मौजूदा संग्रहित प्रक्रियाओं का इस्तेमाल करते थे, इसलिए हमारे पास सामान्य बिंदु थे जहां हम कोड प्रबंधित कर सकते थे। लेकिन अन्य क्षेत्रों में एचटीएमएल में इस एम्बेडेड एसक्यूएल मार्कअप थे। जो बाजार में तेजी से आने के लिए बहुत अच्छा था, लेकिन नई सुविधाओं के प्रत्येक बातचीत के साथ कम से कम दोगुना परीक्षण और रखरखाव करने के लिए दोगुना हो गया।तो जब हम php टाइप कोड को बाहर खींच रहे थे, डेटा परतों में डाल रहे थे (यह 2001-2002 था, किसी भी ओआरएम के पूर्व आदि) और बहुत सी नई विशेषताएं (ग्राहक प्रतिक्रिया) जोड़कर UPGRADES को इंजीनियर करने के इस मुद्दे को देखा गया प्रणाली में जो एक बड़ा सौदा है, क्योंकि उन्नयन के लिए सही ढंग से करने के लिए बहुत पैसा खर्च होता है। अब, अधिकांश पैटर्न और अन्य सभी चीजें लोग चल रहे ओओ कोड के साथ ऊर्जा सौदों की एक डिग्री के साथ चर्चा करते हैं, लेकिन इस तथ्य के बारे में क्या है कि आपके डेटा को ए) को एकीकृत करना है, बी) अर्थ और संरचना डेटा समय के साथ बदल सकता है, और अक्सर डेटा काम करने के तरीके के कारण आप अपने क्लाइंट संगठन में बहुत से उप प्रक्रिया/अनुप्रयोगों के साथ समाप्त होते हैं, जिन्हें उस डेटा की आवश्यकता होती है -> विज्ञापन रिपोर्टिंग या किसी जटिल कस्टम रिपोर्टिंग के साथ-साथ बैच जॉब्स जो कस्टम डेटा फ़ीड्स इत्यादि के लिए किए गए हैं

    इस बात को ध्यान में रखते हुए मैंने मैदान के कुछ बाएं हिस्से के साथ खेलना शुरू कर दिया। इसमें कुछ धारणाएं भी हैं। ए) डेटा लिखने से ज्यादा पढ़ा जाता है। बी) अद्यतन होते हैं, लेकिन बैंक स्तर पर नहीं। एक या 2 एक सेकंड कहते हैं।

    विचार COM/इंटरफ़ेस दृश्य को लागू करना था कि ग्राहकों द्वारा डेटा को कंक्रीट टेबल (जो स्कीमा परिवर्तनों के साथ भिन्न) पर सेट किया गया था। आप प्रत्येक प्रकार के ऑपरेशन के लिए एक अलग दृश्य बना सकते हैं - अद्यतन, हटाएं, डालें और पढ़ें। यह महत्वपूर्ण है। विचार या तो सीधे एक टेबल पर मैप करेंगे, या आपको एक डमी टेबल को ट्रिगर करने की अनुमति मिलती है जो वास्तविक अपडेट या आवेषण इत्यादि करता है। जो मैं वास्तव में चाहता था वह कुछ प्रकार का ट्रैपबल स्तर संकेत था जिसे अभी भी क्रिस्टल रिपोर्ट आदि द्वारा उपयोग किया जा सकता है। नोट - आवेषण, अद्यतन और हटाए जाने के लिए आप संग्रहीत प्रोसेस का भी उपयोग कर सकते हैं। और आपके पास उत्पाद के प्रत्येक संस्करण के लिए एक संस्करण था। इस तरह आपके संस्करण 1.0 में स्कीमा का संस्करण था, और यदि टेबल बदल गए, तो आपके पास अभी भी संस्करण 1.0 दृश्य होंगे लेकिन नए बैकएंड तर्क के साथ आवश्यकतानुसार नई तालिकाओं को मैप करने के लिए, लेकिन आपके पास संस्करण 2.0 दृश्य भी होंगे जो समर्थन करेंगे नए फ़ील्ड इत्यादि। यह वास्तव में केवल विज्ञापन रिपोर्टिंग का समर्थन करने के लिए था, जो कि यदि आपका व्यवसाय व्यक्ति है और कोडर नहीं है तो शायद आपके पास उत्पाद क्यों है इसका पूरा बिंदु है। (आपका उत्पाद बकवास हो सकता है लेकिन यदि आपके पास दुनिया में सबसे अच्छी रिपोर्टिंग है तो भी आप जीत सकते हैं, रिवर्स सत्य है - आपका उत्पाद सबसे अच्छी सुविधा हो सकता है, लेकिन यदि रिपोर्टिंग पर इससे भी बदतर आप आसानी से ढीला हो सकते हैं)।

    ठीक है, उम्मीद है कि उनमें से कुछ विचार मदद करते हैं।

    +6

    यह स्वीकार्य उत्तर कैसे प्राप्त हुआ? यह मूल प्रश्न में बिंदुओं का उत्तर कैसे देता है? –

    +1

    क्या यह उत्तर प्रश्न से संबंधित है? –

    4

    सामान्य रूप से मेरा नियम है: "एप्लिकेशन को अपनी स्वयं की स्कीमा का प्रबंधन करना चाहिए।"

    इसका मतलब है कि स्कीमा अपग्रेड स्क्रिप्ट एप्लिकेशन के लिए किसी भी अपग्रेड पैकेज का हिस्सा हैं और एप्लिकेशन प्रारंभ होने पर स्वचालित रूप से चलाए जाते हैं। त्रुटियों के मामले में एप्लिकेशन शुरू करने में विफल रहता है और अपग्रेड स्क्रिप्ट लेनदेन प्रतिबद्ध नहीं है। इसका नकारात्मक पक्ष यह है कि एप्लिकेशन को स्कीमा में पूर्ण संशोधन पहुंच होनी चाहिए (यह डीबीए को परेशान करता है)।

    मुझे टेबल संरचनाओं का प्रबंधन करने के लिए हाइबरनेट्स स्कीमा अपडेट सुविधा का उपयोग करके बड़ी सफलता मिली है। अपग्रेड स्क्रिप्ट को केवल वास्तविक डेटा प्रारंभिकता को संभालने और कॉलम को कभी-कभी हटाने के लिए छोड़कर (SchemaUpdate ऐसा नहीं करता है)।

    परीक्षण के संबंध में, चूंकि अपग्रेड एप्लिकेशन का हिस्सा हैं, इसलिए उनका परीक्षण परीक्षण के लिए परीक्षण चक्र का हिस्सा बन जाता है।

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

    4

    मैं Red Gate उत्पादों का एक बड़ा प्रशंसक हूं जो डेटाबेस स्कीमा अपडेट करने के लिए SQL पैकेज बनाने में मदद करता है। वर्जनिंग और रोलबैक के साथ मदद करने के लिए डेटाबेस स्क्रिप्ट को स्रोत नियंत्रण में जोड़ा जा सकता है।

    2

    ये सभी भारी विषय हैं, लेकिन यहां अपडेट करने की मेरी सिफारिश है।

    आप अपने मंच निर्दिष्ट नहीं किया है, लेकिन NANT के लिए वातावरण मैं Tarantino का उपयोग निर्माण। प्रत्येक डेटाबेस अद्यतन के लिए आप प्रतिबद्ध करने के लिए तैयार हैं, आप एक परिवर्तन स्क्रिप्ट (RedGate या किसी अन्य उपकरण का उपयोग कर) बनाते हैं। जब आप उत्पादन में निर्माण करते हैं, तो टैरेंटिनो जांचता है कि डेटाबेस पर स्क्रिप्ट चलाया गया है (यह ट्रैक रखने के लिए आपके डेटाबेस में एक टेबल जोड़ता है)। यदि नहीं, तो स्क्रिप्ट चलाया जाता है। डेटाबेस संस्करणों के प्रबंधन से यह सभी मैन्युअल कार्य (पढ़ें: मानव त्रुटि) लेता है।

    8

    liquibase.org:

    1. यह परिभाषाओं हाइबरनेट को समझता है।
    2. बेहतर स्कीमा अद्यतन एसक्यूएल हाइबरनेट
    3. यह लॉग जो उन्नयन एक डेटाबेस
    4. यह दो कदम परिवर्तन हैंडल करने के लिए बनाया गया है की तुलना में उत्पन्न करता है (यानी एक कॉलम "foo" को हटाएं और फिर एक अलग कॉलम नाम बदलने के लिए "foo ")
    5. यह सशर्त उन्नयन की अवधारणा को नियंत्रित करता है
    6. डेवलपर वास्तव में समुदाय को सुनता है (हाइबरनेट के साथ यदि आप" भीड़ "या नौसिखिया में नहीं हैं - आपको मूल रूप से अनदेखा किया जाता है।)

    http://www.liquibase.org

    +0

    [फ्लाईवे] (https://flywaydb.org) एक और विकल्प है, जो कि लिक्विबेस के इरादे में समान है: डाटाबेस माइग्रेशन आसान बनाते हैं, जिससे आप अपनी स्कीमा विकसित कर सकते हैं। फ्लाईवे जावा में बनाया गया है, जिसे जावा से उपयोग के लिए डिज़ाइन किया गया है लेकिन इसे कमांड लाइन से भी बुलाया जा सकता है। लिक्विबेस और फ्लाईवे दोनों अच्छी तरह से प्रोजेक्ट प्रतीत होते हैं। –

    6

    राय

    आवेदन कभी नहीं एक स्कीमा अद्यतन संभाल चाहिए। यह एक आपदा होने का इंतजार कर रहा है। अनुप्रयोगों outlasts डाटा और जैसे ही कई आवेदन एक ही डेटा (उत्पादन एप्लिकेशन + उदाहरण के लिए एक रिपोर्टिंग अनुप्रयोग) के साथ काम करने की कोशिश के रूप में - संभावना वे दोनों एक ही अंतर्निहित कंपनी पुस्तकालयों का उपयोग कर रहे हैं ... और फिर दोनों कार्यक्रमों का फैसला अपने स्वयं के डाटाबेस उन्नयन कर ... कि गंदगी के साथ मजा।

    0

    के रूप में पैट ने कहा, उपयोग liquibase। विशेष रूप से आप अपने खुद के देव डेटाबेस बनाने परिवर्तन है कि उत्पादन डेटाबेस का हिस्सा बन जाएगा के साथ कई डेवलपर्स है जब।

    यदि एक प्रोजेक्ट के रूप में केवल एक ही देव है, तो मैं अभी एक एसवीएस रेपो में एसक्यूएल टेक्स्ट फाइलों के रूप में स्कीमा परिवर्तन करता हूं, जिसे मैं उत्पादन सर्वर पर बैचों में चेक करता हूं, कोड में परिवर्तन में जाना।

    लेकिन liquibase है कि तुलना में बेहतर ढंग से व्यवस्थित है!

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

    • कोई संबंधित समस्या नहीं^_^