sql - समझ - व्हाट इस सकल




एक ओआरएम या सादे एसक्यूएल का उपयोग करना? (9)

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

मैं इसे इस तरह देखता हूं: पोर्टेबिलिटी के लिए ओआरएम का उपयोग करें, सादा एसक्यूएल अगर यह सिर्फ एक प्रकार के डेटाबेस का उपयोग करने जा रहा है। डेटाबेस समर्थन की आवश्यकता वाले ऐप को विकसित करते समय मैं वास्तव में ओआरएम या एसक्यूएल का उपयोग करने के बारे में सलाह ले रहा हूं।

इसके बारे में सोचते हुए, एक ओआरएम का उपयोग कर डेटाबेस असंगतता बनाम संभालने के लिए केवल हल्के रैपर का उपयोग करना बेहतर होगा।


एक ओआरएम का उपयोग करें जो SQL की तरह काम करता है , लेकिन संकलन-समय जांच प्रदान करता है और सुरक्षा टाइप करता है। मेरे पसंदीदा की तरह: डेटा ज्ञान ऑब्जेक्ट्स (प्रकटीकरण: मैंने इसे लिखा)

उदाहरण के लिए:

for (Bug bug : Bug.ALL.limit(100)) {
  int id = bug.getId();
  String title = bug.getTitle();
  System.out.println(id +" "+ title);
}

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


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

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

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

मैंने किसी भी बड़े पैमाने पर आवेदन के लिए पाया है जो आप दोनों दृष्टिकोणों का उपयोग करके स्वयं पाएंगे। (रिपोर्टिंग के लिए सीधे सीआरयूडी और एसक्यूएल / पतली डीएएल के लिए ओआरएम)।


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

एक टिप्पणी के जवाब में संपादित करें कि मैं यह वर्णन करने का अनुरोध करता हूं कि मैं ओआरएम से डीएएल को कैसे अलग करता हूं:

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


कोई 'एक उपकरण-फिट-सब' समाधान नहीं है, और यह प्रश्न के लिए भी सच है 'क्या मुझे एक या एम का उपयोग करना चाहिए या नहीं? '।

मैं कहूंगा: यदि आपको एक ऐसा एप्लिकेशन / टूल लिखना है जो बहुत अधिक तर्क के बिना बहुत अधिक 'डेटा' केंद्रित है, तो मैं सादा एसक्यूएल का उपयोग करता हूं, क्योंकि एसक्यूएल इस तरह के अनुप्रयोगों के लिए डोमेन-विशिष्ट भाषा है।

दूसरी तरफ, यदि मैं एक व्यवसाय / एंटरप्राइज़ एप्लिकेशन लिखना चाहता था जिसमें बहुत से 'डोमेन' तर्क शामिल हैं, तो मैं एक समृद्ध वर्ग मॉडल लिखूंगा जो इस डोमेन को कोड में व्यक्त कर सकता है। ऐसे मामले में, एक OR / M मैपर सफलतापूर्वक ऐसा करने में बहुत उपयोगी हो सकता है, क्योंकि यह आपके हाथों से बहुत अधिक नलसाजी कोड लेता है।


डिलीमा चाहे ढांचे का उपयोग करना है या नहीं, आधुनिक दिन सॉफ्टवेयर विकास परिदृश्य में काफी आम है।

समझने के लिए महत्वपूर्ण बात यह है कि प्रत्येक ढांचे या दृष्टिकोण में इसके पेशेवर और विपक्ष होते हैं - उदाहरण के लिए हमारे अनुभव में हमने पाया है कि लेनदेन से निपटने के दौरान ओआरएम उपयोगी होता है यानी ऑपरेशन डालें / अपडेट / हटाएं - लेकिन जब जटिल के साथ डेटा लाने की बात आती है परिणाम ओआरएम उपकरण के प्रदर्शन और प्रभावशीलता का मूल्यांकन करना महत्वपूर्ण हो जाता है।

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

जब आप उच्च स्तर की समवर्तीता के साथ सम्मिलन, अद्यतन, हटाना, संस्करणिंग की बात करते हैं तो आप ओआरएम का उपयोग कर सकते हैं और आप रिपोर्ट पीढ़ी और लंबी सूची के लिए मूल एसक्यूएल का उपयोग कर सकते हैं


प्रत्येक उपकरण का उद्देश्य और दृष्टि है। मैंने आपकी आवश्यकताओं के अनुरूप http://www.jooq.org/ बनाया है, यद्यपि iBatis शायद आपके लिए भी एक अच्छा समाधान है।

jOOQ में मूल ओआरएम विशेषताएं हैं, लेकिन यह मुख्य रूप से उन चीज़ों पर केंद्रित है जो मुझे लगता है कि अधिकांश डेवलपर्स को उनकी ज़रूरतों के लिए सर्वोत्तम ओआरएम खोजने की कोशिश करते समय सबसे अधिक जरूरत है:

  • कोड पीढ़ी
  • परिवर्तनीय बाध्यकारी (यह जेडीबीसी में दर्द है)
  • एसक्यूएल वाक्यविन्यास abstraction (वाक्यविन्यास त्रुटियों को रोकने के लिए)

लेकिन अक्सर वे बहुत दूर जाते हैं और इतना अमूर्तता प्रदान करते हैं, आपको नहीं लगता कि वे आरडीबीएमएस के खिलाफ चल रहे हैं। दूसरी तरफ, आपने आरडीबीएमएस को ठीक से चुना क्योंकि

  • यह एक मजबूत डेटा स्रोत है
  • एसक्यूएल कई अच्छी, निष्पादक चीजें कर सकता है (नेस्टेड सिलेक्ट, यूनियन, कॉम्प्लेक्स जॉइन इत्यादि)। अक्सर ओआरएम इन चीजों को नहीं कर सकता है।
  • आप लेन-देन और सत्र स्वयं को संभाल सकते हैं
  • आपके पास यूडीटी और संग्रहित प्रक्रियाएं हैं

jOOQ वास्तव में इन बिंदुओं को संबोधित करता है। यह जेडीबीसी के साथ-साथ दर्द के बिना भी प्रदर्शन करेगा।


मेरी ओआरएम का उपयोग वास्तव में उड़ने वाली कुंजी कोड पीढ़ी थी। मैं मानता हूं कि कोड प्रदर्शन शर्तों में ORM मार्ग सबसे तेज़ नहीं है। लेकिन जब आपके पास बड़ी टीम का माध्यम होता है, तो डीबी तेजी से बदल रहा है, बिल्ड प्रक्रिया के हिस्से के रूप में डीबी से कक्षाओं और मैपिंग को पुन: उत्पन्न करने की क्षमता कुछ देखने के लिए शानदार है, खासकर जब आप सीआई का उपयोग करते हैं। तो आपका कोड सबसे तेज़ नहीं हो सकता है, लेकिन आपका कोडिंग होगा - मुझे पता है कि मैं ज्यादातर परियोजनाओं में क्या लेता हूं।

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

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


मैं आर ईड्स के लिए सादे एसक्यूएल, सीयूडी के लिए ओआरएम कहता हूं।

प्रदर्शन कुछ ऐसा है जो मैं हमेशा के लिए चिंतित हूं, विशेष रूप से वेब अनुप्रयोगों में, लेकिन कोड रखरखाव और पठनीयता भी। इन मुद्दों को हल करने के लिए मैंने SqlBuilder लिखा SqlBuilder


मैंने जो ऐप्स विकसित किए हैं उनमें से एक पाइथन में लिखा गया आईआरसी बॉट था। मॉड्यूल जो अलग-अलग धागे में चलते हैं, लेकिन मुझे स्क्लाइट का उपयोग करते समय थ्रेडिंग को संभालने का कोई तरीका नहीं पता चला है। हालांकि, यह एक अलग सवाल के लिए बेहतर हो सकता है।

मुझे वास्तव में केवल शीर्षक और वास्तविक प्रश्न दोनों को दोहराया जाना चाहिए था। मैंने वास्तव में किसी भी भाषा में पहले कभी डीएएल का उपयोग नहीं किया है।





orm