एक ORM या सादे SQL का उपयोग? [बन्द है]


245

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

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

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


मानकीकरण, सुरक्षा, स्थिरता, भाषा अमूर्तता, DRY, आदि
बेन 16

ORM के साथ प्रदर्शन SQL के पास हो सकता है, इस पर निर्भर करता है कि क्या आप इसे सही तरीके से और सही सेटिंग्स के साथ उपयोग करते हैं ... EF6.x को 5x तेज बनाने के लिए देखें: लिंक्डइन.
com

ORM आर्किटेक्चर और कैसे-क्या (कैसे बचें) के लिए, यहाँ मेरा एक और लिंक है: लिंक्डइन.
com

ऑब्जेक्ट-रिलेशनल मैपिंग (ORM) पहले से ही कई प्रोग्रामिंग भाषाओं में बहुत लोकप्रिय है और SQL के लिए सबसे अच्छे विकल्पों में से एक है। मैं अपनी TRIADB परियोजना के लिए CQL बनाने के लिए विधि जंजीर शैली से प्रेरित था। healis.eu/triadb/#latest-release
Athanassios

2
यह गूंगा है कि यह सवाल बंद कर दिया गया था।
मिच गेहूं

जवाबों:


169

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

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

उन अनुप्रयोगों के लिए, जो भारी-भरकम रिपोर्टिंग कर रहे हैं, या प्रति अनुरोध बड़ी संख्या में डेटाबेस पंक्तियों से निपटते हैं, ORM कर बहुत भारी है, और कैशिंग जो वे करते हैं, वह एक बड़े, बेकार मेमोरी-हॉगिंग बोझ में बदल जाता है। उस स्थिति में, एक पतली DAL में सरल SQL मैपिंग (LinQ या iBatis) या हाथ से कोडित SQL क्वेरी जाने का तरीका है।

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


क्या आप 'डेटाबेस पंक्तियों की बड़ी संख्या प्रति अनुरोध' को परिभाषित कर सकते हैं? कृपया :)
Mosselman

तो क्या मैं उदाहरण के लिए आईबीए के साथ जेपीए को एकीकृत कर सकता हूं ?? एएनडी उन्हें एक ही लेनदेन में काम करते हैं?
Jaime Hablutzel

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

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

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

253

जेपीए (जावा पर्सिस्टेंस एपीआई, मूल रूप से जावा / जे 2 ईई / ईजेबी के लिए मानकीकृत ओआरएम एपीआई), जिसमें हाइबरनेट, एक्लिप्सलिंक, टॉपलिंक, ओपनजेपीए और अन्य शामिल हैं, के साथ काम करने वाले किसी व्यक्ति के रूप में बोलते हुए, मैं अपने कुछ हिस्से साझा करूंगा। टिप्पणियों।

  1. ओआरएम तेज नहीं हैं। वे पर्याप्त हो सकते हैं और अधिकांश समय पर्याप्त है ठीक है लेकिन उच्च-मात्रा वाले कम-विलंबता वातावरण में वे एक नहीं-नहीं हैं;
  2. जावा और सी # जैसी सामान्य प्रयोजन प्रोग्रामिंग भाषाओं में आपको उन्हें काम करने के लिए एक भयानक जादू की आवश्यकता होती है (जैसे जावा, इंस्ट्रूमेंटेशन आदि में लोड-टाइम बुनाई);
  3. ओआरएम का उपयोग करते समय, एसक्यूएल से आगे निकलने के बजाय (जो कि इरादे से प्रतीत होता है), आप हैरान होंगे कि आप एक्सएमएल और / या एनोटेशन / विशेषताओं को खर्च करने में कितना समय लगाते हैं और अपने एसटीएम को प्रदर्शनकारी एसक्यूएल उत्पन्न करने के लिए प्राप्त करते हैं;
  4. जटिल प्रश्नों के लिए, वास्तव में कोई विकल्प नहीं है। जैसे जेपीए में कुछ प्रश्न हैं जो केवल संभव नहीं हैं जो कच्चे एसक्यूएल में हैं और जब आपको जेपीए में कच्चे एसक्यूएल का उपयोग करना है तो यह सुंदर नहीं है (सी # / नेट कम से कम डायनेमिक प्रकार - var - जो बहुत है। ऑब्जेक्ट ऑब्जेक्ट की तुलना में अच्छे);
  5. ओआरएम का उपयोग करते समय बहुत सारे "गोच" होते हैं। इसमें अनपेक्षित या अनपेक्षित व्यवहार शामिल है, यह तथ्य कि आपको अपने डेटाबेस में SQL अपडेट्स करने के लिए JPA या इसी तरह के तरीकों से SQL अपडेट करने की क्षमता का निर्माण करना है क्योंकि JPA डिफ़ॉल्ट रूप से सब कुछ कैश करता है इसलिए यह एक सीधा डेटाबेस को नहीं पकड़ेगा अद्यतन - प्रत्यक्ष एसक्यूएल अद्यतन चलाना एक सामान्य उत्पादन समर्थन गतिविधि है);
  6. ऑब्जेक्ट-रिलेशनल मिसमैच हमेशा समस्याएं पैदा करने वाला होता है। ऐसी किसी भी समस्या के साथ अमूर्तता की जटिलता और पूर्णता के बीच एक व्यापार है। कई बार मुझे लगा कि जेपीए बहुत दूर चला गया और कम रिटर्न का एक वास्तविक कानून मारा, जहां जटिलता हिट अमूर्त द्वारा उचित नहीं थी।

एक और समस्या है जो थोड़ा और स्पष्टीकरण लेती है।

वेब एप्लिकेशन के लिए पारंपरिक मॉडल में एक दृढ़ता परत और एक प्रस्तुति परत होती है (संभवतः बीच में एक सेवाओं या अन्य परतों के साथ लेकिन ये इस चर्चा के लिए महत्वपूर्ण दो हैं)। ORMs आपकी दृढ़ता परत से लेकर प्रस्तुति परत (यानी आपकी इकाइयाँ) तक के कठोर दृश्य को बल देते हैं।

अधिक कच्चे SQL तरीकों की आलोचनाओं में से एक यह है कि आप इन सभी VO (मान ऑब्जेक्ट) या DTOs (डेटा ट्रांसफर ऑब्जेक्ट) के साथ समाप्त होते हैं जो केवल एक क्वेरी द्वारा उपयोग किए जाते हैं। इसे ORM के लाभ के रूप में टाल दिया जाता है क्योंकि आप इससे छुटकारा पा लेते हैं।

बात यह है कि उन समस्याओं को ओआरएम के साथ दूर नहीं जाना है, वे बस प्रस्तुति परत तक जाते हैं। प्रश्नों के लिए VO / DTO बनाने के बजाय, आप कस्टम प्रस्तुति ऑब्जेक्ट बनाते हैं, आमतौर पर प्रत्येक दृश्य के लिए। यह कैसे बेहतर है? IMHO यह नहीं है।

मैंने इसके बारे में ORM या SQL में लिखा है : क्या हम अभी तक वहाँ हैं?

मेरी पसंद की तकनीक (जावा में) इन दिनों इब्तिदा है। यह SQL के चारों ओर एक बहुत पतला आवरण है जो 90% + करता है जो JPA कर सकता है (यह रिश्तों की आलसी-लोडिंग भी कर सकता है, हालांकि इसकी अच्छी तरह से प्रलेखित नहीं है) लेकिन बहुत कम ओवरहेड (जटिलता और वास्तविक कोड के संदर्भ में) के साथ।

यह पिछले साल एक GWT आवेदन मैं लिख रहा था में आया था। सेवा कार्यान्वयन में EclipseLink से प्रस्तुति ऑब्जेक्ट्स में अनुवाद के बहुत सारे। यदि हम ibatis का उपयोग कर रहे हैं, तो यह ibatis के साथ उपयुक्त ऑब्जेक्ट बनाने के लिए कहीं अधिक सरल होगा और फिर उन्हें सभी तरह से ऊपर और नीचे स्टैक से गुजारें। कुछ शुद्धतावादियों का तर्क हो सकता है कि यह Bad ™ है। हो सकता है कि ऐसा (सिद्धांत रूप में) लेकिन मैं आपको बताता हूं: यह सरल कोड, एक सरल स्टैक और अधिक उत्पादकता के लिए नेतृत्व करेगा।


2
मुझे इस तरह की चीजों पर संसाधन इकट्ठा करने के लिए एक और (हालांकि समुदाय विकि) प्रश्न पोस्ट करने के लिए प्रेरित किया गया है। आखिरी पैराग्राफ के बारे में: मुझे सादगी पसंद है। शायद बहुत ज्यादा।
हाइड्रिपेटेज़

3
iBATIS बहुत अच्छा है, लेकिन शायद आप jOOQ की कोशिश करना पसंद करेंगे: jooq.sourceforge.net । इसका मुख्य ध्यान आपके द्वारा बताए गए 6 कारणों के लिए SQL के करीब रहना ठीक है।
लुकास एडर

5
बिंदु के लिए +1 3. कई लोग महसूस करते हैं कि ORM का उपयोग आपको SQL की गहन समझ होने से राहत देता है। बात यह है कि एक बार जब आप एसक्यूएल के साथ जिमनास्टिक करना सीख सकते हैं, तो आप शायद खुद को ओआरएम से दूर जाना चाहेंगे ... बहुत जल्दी।
रयान फर्नांडिस

4
इसलिए, अब यह 2013 का अंत है और जैसा कि हम सभी जानते हैं, "पुराने तथ्यों" से अधिक भ्रामक कुछ भी नहीं हो सकता है - तो क्या मैं आपसे पूछ सकता हूं कि क्या आपके अंक अभी भी समान हैं? यदि नहीं, तो यह बहुत अच्छा होगा यदि आप एक ब्लॉगपोस्ट लिख सकते हैं / तदनुसार अपना उत्तर अपडेट कर सकते हैं।
डोमिनिक

3
var .NET में एक डायनेमिक प्रकार का उत्पादन नहीं करता है, डायनेमिक कीवर्ड वाले वैरिएबल .NET में डायनामिक प्रकार होते हैं। var अभी भी स्टेटिक टाइपिंग है। देखें stackoverflow.com/questions/961581/…
फ़ाज़ी

45

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

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


1
CUD क्या है? मुझे परिभाषा नहीं मिल रही है।
किम्ची मैन

27
@ किमचीमैन सीआरयूडी आर के बिना
मैक्स टोरो

3
CUD - बनाएं, अपडेट करें, हटाएं।
मिलाएं

14

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


3
मैं डेटाबेस जायके भर में पोर्टेबिलिटी के करीब कुछ सोच रहा था। मुझे देर रात तक सवाल पोस्ट नहीं करना चाहिए।
हाइड्रोपेटेज़

1
ठीक यही मैं कह रहा था: यहां तक ​​कि सबसे बुनियादी परिदृश्य संभावित रूप से विभिन्न DBMSes में त्रुटियों के अधीन हो सकते हैं - उदाहरण के लिए, NULLs के विभिन्न हैंडलिंग।
एंटोन गोगोलेव

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

11

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


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

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


2
आप DAL क्या है और ORM क्या है के बीच की रेखा खींचते हैं?
अराजकता

4
इसलिए, यदि आप एक ORM के लेखक हैं, तो आपका ORM स्वतः DAL में वापस आ जाता है। :)
बॉम्बे

DAL = दृढ़ता परत और ORM एक उपकरण है जिसका उपयोग आप अपने DAL के अंदर डेटा स्टोर में CRUD संचालन करने के लिए करते हैं।
वाहिद गदिरी

7

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

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

  • कोड पीढ़ी
  • चर बंधन (यह JDBC में दर्द है)
  • SQL सिंटैक्स अमूर्त (सिंटैक्स त्रुटियों को रोकने के लिए)

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

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

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


6

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

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

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

जब आप प्रविष्टि, अपडेशन, विलोपन, उच्च स्तर की संगोष्ठी के साथ संस्करण बनाने के लिए ORM का उपयोग कर सकते हैं और आप रिपोर्ट जनरेशन और लंबी लिस्टिंग के लिए Native SQL का उपयोग कर सकते हैं


3
उच्च समवर्ती के लिए ORM बेहतर क्यों है?
user359996

6

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

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

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


2
बिल्कुल व्यक्तिगत स्वाद की बात। मेरे लिए, कोड पीढ़ी एक दोष है।
dkretz

5
दूसरा पैराग्राफ पढ़ें .... शायद पूर्णता भी उपयोगी है
MrTelly

कोड जनरेशन कुछ कार्यों को जल्दी पूरा करने का एकमात्र तरीका है। सभी साधनों की तरह यह शक्तिशाली हो सकता है या किसी आपदा को जन्म दे सकता है। तकनीकी रूप से सभी भाषाएँ अन्य प्रकार के कोड का उत्पादन कर रही हैं।
बंजोकेट

4

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

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

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


"कोई 'एक उपकरण-फिट-सभी' समाधान नहीं है .. अच्छी तरह से वहाँ होना चाहिए।
रशिनो

1

मेरे द्वारा विकसित किए गए ऐप्स में से एक IRC बॉट है जिसे अजगर में लिखा गया था। मॉड्यूल का उपयोग करता है अलग धागे में चलाने के लिए, लेकिन मैं sqlite का उपयोग करते समय सूत्रण को संभालने के लिए एक तरीका नहीं है। हालांकि, यह एक अलग प्रश्न के लिए बेहतर हो सकता है।

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


4
खैर, मेरी राय है कि आपको चाहिए। सभी जगह कच्चे एसक्यूएल बहुत घृणित हैं।
अराजकता

अच्छी तरह से हाँ। मंच सॉफ्टवेयर का एक टुकड़ा है जिसे मैं समय-समय पर हैक करता हूं जिसमें सभी जगह mysql_query () और mysql_result () के टन हैं । यह पागल है।
हाइड्रोपेटेज़

आप जिस "ऐप" की बात करते हैं, वह क्या है?
ज़ोरान पावलोविक

यह अजीब बात है कि यह सवाल एक irc बॉट ऐप पर पूछा गया था और यह एक बहुत ही उपयोगी मार्गदर्शिका बन गई थी! एक irc बॉट ऐप पैमाने के एक छोर पर है, और एक एप्लिकेशन जिसमें जटिल जोड़ के साथ 50-100 + टेबल हैं और उस पर काम करने वाले 20+ डेवलपर्स के साथ लाखों डेटा डेटा हैं, पैमाने के चरम दूसरे छोर पर है। मैं यह कहने की हिम्मत करता हूं कि जब पैमाने के 'irc बॉट ऐप' का अंत होता है, तो यह मुश्किल से मायने रखता है।
मनची

1

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

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

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

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


आपकी IDE इस तरह की स्थैतिक जाँचें भी सीधे प्रदान कर सकती है (IDEA DB संरचना को जानता है इसलिए आप इसे लंबे समय तक बताते हैं कि DB कहाँ है / जहाँ DDL फाइलें हैं, इसलिए यह आपके SQL प्रश्नों / प्रक्रियाओं / प्रक्रियाओं / जो कुछ भी हो) में टाइप चेक / रिलेशन चेक / आदि कर सकता है )
एक्सनोस

यह उपयोगी है। क्या यह इसे बिल्ड / CI स्टेप के हिस्से के रूप में कर सकता है? यह वर्ग बनाम अन्य तारों को कैसे वर्गीकृत करता है? यह स्ट्रिंग हेरफेर, या केवल स्ट्रिंग स्थिरांक संभाल सकता है?
केरेडसन

मैं abBlock द्वारा अवरुद्ध हो जाऊंगा, लेकिन IntelliJ किसी भी अन्य भाषा के जेटब्रेबिन की तरह SQL को पार्स करता है ।datagrip/features तो कोई इसे CI / CD / निर्माण में एकीकृत कर सकता है (शायद IJ टीम द्वारा SQL pinging कोड को अलग करने के लिए कहा जा सकता है? शायद सोनार पहले से? ऐसी परसर) है। पार्सिंग डेटा प्रकार लाता है ताकि आप उन पर चेक जोड़ सकें (मैंने कस्टम प्लगइन के साथ ऐसा किया है), या "जॉइन कॉलम में एफके सूचकांक है?" जैसे चेक। आदि ये देशी IJ के SQL निरीक्षणों के लिए नीट इंप्रूवमेंट होंगे
Xenos

1

मुझे पता है कि यह सवाल बहुत पुराना है, लेकिन मैंने सोचा कि अगर मेरे जैसा कोई भी व्यक्ति आता है, तो मैं उत्तर दूंगा। ORM ने एक लंबा सफर तय किया है। उनमें से कुछ वास्तव में आपको दोनों दुनिया का सर्वश्रेष्ठ देते हैं: विकास को अधिक उत्पादक बनाना और प्रदर्शन को बनाए रखना।

SQL डेटा ( http://sqldata.codeplex.com ) पर एक नज़र डालें । यह c # के लिए बहुत हल्का वजन ORM है जो सभी ठिकानों को कवर करता है।

FYI करें, मैं SQL डेटा का लेखक हूं।


1

मैं अपनी आवाज़ को उत्तरों के कोरस में जोड़ना चाहता हूं जो कहता है कि "एक बीच का मैदान है!"।

एप्लिकेशन प्रोग्रामर के लिए, SQL उन चीजों का मिश्रण है, जिन्हें आप नियंत्रित करना चाहते हैं और जिन चीजों को आप निश्चित रूप से नियंत्रित नहीं करना चाहते हैं।

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

तो मैंने कुछ ऐसा लिखा जो ऐसा करता है: http://quince-lib.com/

यह C ++ के लिए है: मुझे नहीं पता कि यह वह भाषा है जिसका आप उपयोग कर रहे हैं, लेकिन सभी एक ही यह देखने के लिए दिलचस्प हो सकते हैं कि "बीच का मैदान" कैसा दिख सकता है।

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