यह एक अच्छा सवाल है। (वहाँ एक उच्च मौका इस 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 दृश्य भी होंगे जो समर्थन करेंगे नए फ़ील्ड इत्यादि। यह वास्तव में केवल विज्ञापन रिपोर्टिंग का समर्थन करने के लिए था, जो कि यदि आपका व्यवसाय व्यक्ति है और कोडर नहीं है तो शायद आपके पास उत्पाद क्यों है इसका पूरा बिंदु है। (आपका उत्पाद बकवास हो सकता है लेकिन यदि आपके पास दुनिया में सबसे अच्छी रिपोर्टिंग है तो भी आप जीत सकते हैं, रिवर्स सत्य है - आपका उत्पाद सबसे अच्छी सुविधा हो सकता है, लेकिन यदि रिपोर्टिंग पर इससे भी बदतर आप आसानी से ढीला हो सकते हैं)।
ठीक है, उम्मीद है कि उनमें से कुछ विचार मदद करते हैं।
मैं वहाँ नहीं अधिक जवाब यहाँ हैं हैरान हूँ - शायद विशिष्ट ओरेकल या sqlserver टैग जरूरत है? –
अच्छा विचार, धन्यवाद! –