स्कैला जैसी कार्यात्मक भाषा में मुझे ओआरएम की आवश्यकता क्यों नहीं होगी?


30

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

लेकिन सबसे महत्वपूर्ण बिंदु यह है: क्या आपको वास्तव में ऑब्जेक्ट्स मैपर से एक संबंध की आवश्यकता है जब आपके पास एक कार्यात्मक भाषा की शक्ति है? शायद ऩही। डेटा ट्रांसफ़ॉर्मेशन में जावा की शक्ति की कमी को दूर करने के लिए जेपीए एक सुविधाजनक तरीका है, लेकिन जब आप इसका इस्तेमाल करना शुरू करते हैं तो यह वास्तव में गलत लगता है।

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

व्यापार तर्क के लिए एक DDD दृष्टिकोण अभी भी Scala के साथ समझ में आता है, है ना?


3
यह एक राय आधारित प्रश्न है। स्काला विशुद्ध रूप से कार्यात्मक नहीं है, यह भी एक ओओ भाषा है, इसलिए यह समझाएगा कि आप अभी भी ORM टूल का उपयोग क्यों करना चाहते हैं। DB मानचित्रण के लिए, उदाहरण के लिए देखें: स्लीक , SORM , Anorm
जेसपर

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

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


5
आपको किसी भी प्रमुख भाषा में ORM की आवश्यकता नहीं है
ग्रैंडमास्टरबी

जवाबों:


30

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

कोई ओआरएम आवश्यक नहीं

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

फ्रंट पेज इस तरह ORM का वर्णन करता है:

SQLAlchemy अपने ऑब्जेक्ट-रिलेशनल मैपर (ORM) के लिए सबसे प्रसिद्ध है, एक वैकल्पिक घटक जो डेटा मैपर पैटर्न प्रदान करता है, जहां कक्षाओं को खुले अंत में डेटाबेस में मैप किया जा सकता है, कई तरीके - ऑब्जेक्ट मॉडल और डेटाबेस स्कीमा को एक में विकसित करने की अनुमति देता है शुरुआत से ही साफ-सुथरा रास्ता।

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

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

// Typesafely execute the SQL statement directly with jOOQ
Result<Record3<String, String, String>> result =
    create.select(BOOK.TITLE, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
          .from(BOOK)
          .join(AUTHOR)
          .on(BOOK.AUTHOR_ID.equal(AUTHOR.ID))
          .where(BOOK.PUBLISHED_IN.equal(1948))
          .fetch();

अब, प्ले फ्रेमवर्क लीग में 100% नहीं लगता है जो मैंने अभी वर्णित किया है , लेकिन उनका तर्क इस सामान्य स्थान में लगता है: रिलेशनल मॉडल के साथ इसे कक्षाओं में अनुवाद करने और सीधे उनसे वापस करने के बजाय सीधे काम करें।

JOOQ पुस्तकालय ORMs के लिए एक जवाब के रूप में अध्ययन कर के लायक है। उनके पास कुछ प्रासंगिक ब्लॉग प्रविष्टियाँ हैं जो पढ़ने लायक हैं:


19

जब तक आप बहुत सारी कार्यात्मक प्रोग्रामिंग नहीं कर लेते, यह समझाना कठिन है। ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग में, आपका डेटा एक ऑब्जेक्ट में अटका हुआ होता है और वहाँ रहता है। वह वस्तु थोड़े से इधर से उधर हो जाती है, और काफी संशोधित हो जाती है, लेकिन आप आमतौर पर मौलिक रूप से उस डेटा के जीवनकाल में उसी "पहचान" के साथ काम करते हैं।

ORM आमतौर पर उस प्रतिमान के आसपास डिज़ाइन किए जाते हैं। आप डेटाबेस से कुछ डेटा को पुनः प्राप्त करते हैं, इसे एक ऑब्जेक्ट में बदल देते हैं, संभावित रूप से इसे एक गुच्छा संशोधित करते हैं, और जब आप पूरा कर लेते हैं, तब भी आपके पास वही ऑब्जेक्ट होता है जिसे आप डेटाबेस में वापस लिख सकते हैं।

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


1
+1000 जो लोग स्काला का उपयोग करने पर जोर देते हैं जैसे कि यह जावा ++ मुझे भाषा के भविष्य के लिए भयभीत करता है :(
एंड्रेस एफ।

9

Scala में, यह अभी भी डेटाबेस टेबल को ऑब्जेक्ट्स में मैप करने के लिए उपयोगी है, और इसे करने के कई तरीके हैं।

स्काला की दुनिया में एक लोकप्रिय ढांचा चालाक है । यह एक ORM नहीं है, क्योंकि यह कम करता है (अर्थात्, यह स्पष्ट रूप से जुड़ने के लिए नहीं कहा जाता है)

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

यह ध्यान रखना चाहिए कि लोगों को बहुत पतले पुस्तकालयों का उपयोग करके बड़ी सफलता मिली है, जैसे कि एनॉर्म या सीधे जेडीबीसी भी, कोड को सुंदर बनाए रखने के लिए कार्यात्मक तकनीकों का उपयोग करना।

JDBC के शीर्ष पर कार्यात्मक तकनीकों को लागू करने वाला एक शानदार पुस्तकालय भी डोबी है

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


0

आपको ऑब्जेक्ट-ओरिएंटेड भाषाओं में भी ORM की आवश्यकता नहीं है।

सबसे पहले, किसने कहा कि आपके डेटा को आपके निरंतर भंडारण से आपकी वस्तु में भौतिक रूप से कॉपी किया जाना चाहिए? स्मालटाक के पीछे एक आदमी एलन के , वस्तुओं को डेटा से छुटकारा चाहता था । उन्होंने सुझाव दिया कि किसी वस्तु में केवल उस क्षेत्र का संदर्भ हो सकता है जहां उसका डेटा संग्रहीत है।

दूसरा - इसे प्राप्त करने का सबसे अच्छा तरीका क्या है? मैं उनकी ज़िम्मेदारियों के आधार पर आपकी वस्तुओं की पहचान करने की सलाह देता हूं , न कि उनके पास मौजूद डेटा के बारे में सोचने की। यदि आपने सीआरसी कार्ड के दृष्टिकोण के बारे में सुना है, तो इसका ठीक उसी तरह उपयोग किया जाता है।

और, आखिरकार, यदि आप कभी भी ओओ-फील्ड में लौटेंगे, तो इसे लागू करने का एक तरीका है

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