डेटाबेस अमूर्तता - क्या यह अधिक हो रहा है?


18

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

और यह तथ्य के बाद भी पठनीयता को छूने के बिना है:

# Exhibit A:  A typical DAL
rows = db(db.ips_x_users.ip_addr == '127.0.0.1')
    .inner_join(db.ips_x_users.user_id == db.users.id)
    .select(order=(db.ips_x_users.last_seen, 'desc'), limit=10)

# Exhibit B:  Another typical DAL
rows = db.ips_x_users
    .join(db.users, on=db.ips_x_users.user_id == db.users.id)
    .filter(db.ips_x_users.ip_addr == '127.0.0.1')
    .select(sort=~db.ips_x_users, limit=10)

# Exhibit C:  A hypothetical DAL based on standard SQL syntax
rows = db('''SELECT * FROM ips_x_users
             INNER JOIN users ON
                 (ips_x_users.user_id = users.id)
             WHERE ips_x_users.ip_addr = ip
             ORDER BY last_seen DESC LIMIT 10''', ip='127.0.0.1')

मानक SQL सिंटैक्स में क्या गलत है? यह एक विशिष्ट उद्देश्य के लिए बनाया गया था, और यह उस उद्देश्य को खूबसूरती से फिट करता है। शायद यह सिर्फ मुझे है, लेकिन मैं स्निपेट सी को पहले दो की तुलना में अधिक आसानी से समझता हूं। नामांकित कीवर्ड और सिंटैक्स ट्रिक प्यारे होते हैं, लेकिन IMO, जब यह इसके ठीक नीचे आता है, तो वे कोडर के लिए पंक्तियों को पुनः प्राप्त करना आसान नहीं बनाते हैं।

यह शायद एक लंबे शेख़ी तरह लग रहा था, लेकिन वहाँ है यहाँ एक असली सवाल। चूँकि हर DAL कोशिश किए गए और सच्चे SQL को पार्स करने के बजाय प्रश्नों के लिए एक नए DSL का आविष्कार करता है, इसलिए या तो अलग-अलग सिंटैक्स का उपयोग करने के लाभ होने चाहिए, या मानक SQL सिंटैक्स में उन कमियों का उपयोग करना चाहिए जिनका मुझे एहसास नहीं है। क्या कोई यह बता सकता है कि मैं यहाँ क्या देख रहा हूँ?


2
मानक एसक्यूएल के साथ सबसे बड़ी समस्या यह है कि कई क्वेरीज़ हैं जो डेटाबेस विशिष्ट हैं। बाहरी जोड़ वाक्य रचना बेतहाशा भिन्न होती है, जैसा कि "विंडो" क्वेरी प्राप्त करने की प्रक्रिया होती है। इसके लिए डीएएल की जरूरत है। अब, यदि DAL द्वारा प्रयुक्त SQL का एक मानक संस्करण था, जो जानता है कि विभिन्न SQL विक्रेताओं की बेवकूफियों से कैसे निपटना है, तो मैं इसका स्वागत करता हूं।
बेरिन लोरिट्श

जवाबों:


10

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

अगली समस्या वास्तव में एक कोरोलरी है: यदि आपके पास बस कुछ SQL आपके कोड में लिखा है, तो संकलक इसके बारे में कुछ नहीं कर सकता है। कॉलम नामों में टाइपो जैसी त्रुटियां केवल रनटाइम पर आएंगी। यह मूल रूप से है, आप अपने स्रोत कोड में अपनी क्वेरी का सिर्फ एक स्ट्रिंग प्रतिनिधित्व क्यों नहीं चाहते हैं, लेकिन कुछ कंपाइलर सांख्यिकीय रूप से सभी फेसपालम-बग के 95% को रोकने के लिए विश्लेषण कर सकते हैं।

और आखिरी समस्या तब होती है, जब आप एक रिलेशनल डेटाबेस को अपनी भाषा के शब्दार्थ और प्रोग्रामिंग मॉडल में मैप करने का प्रयास करते हैं: RDBMSs OOP (या नेविगेशनल डेटा रिट्रीवल) के साथ अच्छी तरह से नहीं जाते हैं। वास्तव में, यह उन दोनों को मिलाकर काफी भयानक विचार है, लेकिन यह SQL डेटाबेस (यानी ORM) के लिए सभी ऑब्जेक्ट ओरिएंटेड DAL है। लेकिन इन सभी अमूर्त परतों के रिसाव की निंदा की जाती है। मुझे लगता है कि यह मूल रूप से क्यों उनमें से बहुत सारे हैं: क्योंकि आप उनके साथ काम करते हैं, आप देखते हैं कि वे त्रुटिपूर्ण हैं, आप एक डीएएल लिखने के लिए सेट करते हैं जो इसे सही करता है और अंततः विफल होता है।

इसलिए जब समस्याएँ एक और दो DALs कि SQL से छुटकारा पाने का सुझाव देती हैं, तो समस्या तीन का अर्थ है एक (OOP के लिए कम से कम) होने का कोई सीधा आगे समाधान नहीं है और इस प्रकार हमेशा अलग-अलग ताकत और सीमाओं के साथ DALs का एक समुद्र होगा। अंत में, आप सभी कर सकते हैं ध्यान से कुछ चुन सकते हैं और उनसे चिपके रहते हैं।


3
"RDBMSs OOP के साथ अच्छी तरह से नहीं चलते हैं" - क्या सॉफ्टवेयर में सब कुछ OO होना है?
मात्रा_देव

@quant_dev: नहींं। लेकिन 'एब्स्ट्रेक्शन'-लेयर्स स्वाभाविक रूप से कम से कम 'एब्सट्रैक्शन ओरिएंटेड' हैं। साथ ही प्रदान किए गए कोड स्निपेट सुझाव देते हैं, कि हम OO- कोड की बात कर रहे हैं।
बैक

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

9

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


3
@ नोट - लेकिन फिर डीएएल के पास एक पूर्ण एसक्यूएल पार्सर होना चाहिए और इसकी अपनी समर्थित बोली होनी चाहिए जो किसी विशेष डेटाबेस से भिन्न होगी। और फिर यह एक उपयुक्त डेटाबेस-विशिष्ट एसक्यूएल स्टेटमेंट जेनरेट करने वाली सभी जटिलताएं होंगी। उदाहरण के लिए, आपके उदाहरण में LIMIT कीवर्ड MySQL में मान्य है, लेकिन Oracle या SQL सर्वर में नहीं है।
जस्टिन गुफा

2
अब हम सवाल का मांस ले रहे हैं। SQL के गैर-मानक बोली से बेहतर विधि नामों और ऑपरेटर अधिभार का एक गैर-मानक सेट क्या बनाता है? SQL का उपयोग करने से कम से कम कोडर को फ्रेमवर्क सीखने के लिए एक परिचित आधार मिल जाएगा।
स्वयं पर ध्यान दें -

3
@ स्वयं के लिए: शायद इसलिए कि धाराप्रवाह शैली एपीआई लिखना आसान है क्योंकि यह एसक्यूएल की कुछ बोली में एसक्यूएल पार्सर लिखना है और फिर एसक्यूएल की कुछ अन्य बोली में अनुवाद करना है।
डीन हार्डिंग

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

3
"आप स्पष्ट तथ्य को नजरअंदाज कर रहे हैं कि सभी डेटाबेस प्लेटफ़ॉर्म एक ही SQL सिंटैक्स को स्वीकार नहीं करते हैं" - हाँ, लेकिन आप किसी भी डेटाबेस के खिलाफ चलाने के लिए कितनी बार कोड लिखते हैं ? आमतौर पर एक DB मंच एक महत्वपूर्ण निवेश है और अक्सर बदला नहीं जाता है। इसके अलावा, एक महत्वपूर्ण प्रकार के डेटाबेस के खिलाफ अपने प्रश्नों का अनुकूलन करने से महत्वपूर्ण दक्षता हासिल की जा सकती है।
क्वांट_देव

5

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

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

यह निश्चित रूप से आपको एक बढ़त देता है जब आप एक ही स्तर पर डेटा एक्सेस कोड में हेरफेर कर सकते हैं और एक ही प्रतिमान के साथ जब आप अपने आवेदन कोड के साथ अपना काम करते हैं।

कुछ शब्दों में - सरलीकरण, चपलता, तेजी, ये लक्ष्य हैं।


4

जोएल ने 10 साल पहले अच्छा लेख लिखा था: डोंट लेट आर्किटेक्चर एस्ट्रोनॉट्स स्केयर यू

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

जब आप किसी चीज़ का उपयोग करते हैं, तो यह जानना महत्वपूर्ण है कि इसे कैसे लागू किया जाता है, इसका मतलब है कि आपको पुस्तकालय / उपकरण सीखने में बहुत समय बिताना चाहिए। यदि आपके पास इसे सीखने का समय नहीं है - उपयोग न करें। भले ही यह शुरू से ही बहुत आसान लगे।


हां, मैंने जिस कंपनी के लिए अतीत में काम किया था, उसने हाइबरनेट का उत्साहपूर्वक उपयोग करना शुरू कर दिया था। तब उन्हें पता चला कि चौंका देने वाली (एक अजीब तरीके से) रूपरेखा द्वारा उत्पन्न प्रश्न कैसे हो सकते हैं।
मात्रा_देव

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