खैर, एक बात जो महत्वपूर्ण है जब भी हमारे पास इस तरह की चर्चा होती है, वह वस्तु संबंधपरक मैपर्स ("ओआरएम") और डेटाबेस अमूर्त परतों के बीच स्पष्ट रूप से अंतर करना है । एक 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 के लिए एक जवाब के रूप में अध्ययन कर के लायक है। उनके पास कुछ प्रासंगिक ब्लॉग प्रविष्टियाँ हैं जो पढ़ने लायक हैं: