एक ओआरएम कैसे जंजीर एक्सेसर्स जैसी सुविधाओं को पूरा करने में कामयाब होता है और उन्हें आम तौर पर कितनी गहरी काम करने की उम्मीद है?
कोई भी इसका उत्तर नहीं दिया है। मैं जल्दी से वर्णन कर सकता हूं कि PHP में यह सिद्धांत कैसे करता है।
सिद्धांत में, किसी ऑब्जेक्ट मॉडल पर जो फ़ील्ड आप देखते हैं, वास्तव में उस वर्ग के लिए परिभाषित नहीं किया जाता है। तो आपके उदाहरण में, $ कार-> मालिकों, $ कार के वर्ग में परिभाषित 'मालिक' नामक कोई वास्तविक क्षेत्र नहीं है।
इसके बजाय, ओआरएम __get and __set जैसे जादू विधियों का उपयोग करता है। तो जब आप $ car-> रंग जैसे अभिव्यक्ति का उपयोग करते हैं, आंतरिक रूप से PHP कॉल करते हैं Doctrine_Record #__ get ('color')।
इस बिंदु पर ओआरएम किसी भी तरह से इसे संतुष्ट करने के लिए स्वतंत्र है। यहां बहुत सारे संभावित डिज़ाइन हैं। यह इन मानों को $ _values नामक सरणी में संग्रहीत कर सकता है, उदाहरण के लिए, और उसके बाद $ -> _ मान ['रंग'] वापस लौटाएं। विशेष ट्रैक में सिद्धांत न केवल प्रत्येक रिकॉर्ड के लिए मूल्य, बल्कि डेटाबेस में दृढ़ता के सापेक्ष इसकी स्थिति भी ट्रैक करता है।
इसका एक उदाहरण अंतर्ज्ञानी नहीं है सिद्धांत के संबंधों के साथ है। जब आपको $ कार का संदर्भ मिलता है, तो इसका उन लोगों के साथ संबंध होता है जिन्हें 'मालिक' कहा जाता है। तो $ कार-> मालिकों के लिए डेटा वास्तव में $ कार के डेटा से अलग तालिका में संग्रहीत किया जाता है। इसलिए ओआरएम में दो विकल्प हैं:
- प्रत्येक बार जब आप $ उपयोगकर्ता लोड करते हैं, तो ओआरएम स्वचालित रूप से सभी संबंधित तालिकाओं में शामिल होता है और उस जानकारी को ऑब्जेक्ट में पॉप्युलेट करता है। अब जब आप $ कार-> मालिक करते हैं, तो वह डेटा पहले से मौजूद है। हालांकि, यह विधि धीमी है, क्योंकि वस्तुओं के कई रिश्ते हो सकते हैं, और उन रिश्तों में खुद के संबंध हो सकते हैं। तो आप जोड़ रहे होंगे में बहुत से जुड़ते हैं और जरूरी नहीं कि उस जानकारी का उपयोग भी किया जाए।
- प्रत्येक बार जब आप $ उपयोगकर्ता लोड करते हैं, तो ORM नोटिस करता है कि कौन से फ़ील्ड उपयोगकर्ता तालिका से लोड की जाती हैं और यह उन्हें पॉप्युलेट करती है, लेकिन संबंधित तालिकाओं से लोड किए गए किसी भी फ़ील्ड को लोड नहीं किया जाता है। इसके बजाए, उन फ़ील्ड से कुछ मेटाडाटा संलग्न हैं जिन्हें उन्हें 'लोड नहीं किया गया है, लेकिन उपलब्ध' के रूप में चिह्नित किया गया है। अब जब आप $ car-> मालिकों को अभिव्यक्ति लिखते हैं, तो ओआरएम देखता है कि 'मालिकों' रिश्ते को लोड नहीं किया गया है, और यह उस जानकारी को प्राप्त करने के लिए एक अलग क्वेरी जारी करता है, इसे ऑब्जेक्ट में जोड़ता है, और उसके बाद उस डेटा को वापस कर देता है। यह सब बिना पारदर्शी रूप से होता है जब आपको इसे महसूस करने की आवश्यकता होती है।
बेशक, सिद्धांत # 2 का उपयोग करता है, क्योंकि # 1 मध्यम जटिलता वाले किसी वास्तविक उत्पादन साइट के लिए अनावश्यक हो जाता है। लेकिन इसका दुष्प्रभाव भी है। यदि आप $ कार पर कई रिश्ते का उपयोग कर रहे हैं, तो जब आप इसे एक्सेस करेंगे, तो सिद्धांत प्रत्येक को अलग से लोड करेगा। तो आप 5-6 प्रश्नों को चलाते हैं जब शायद केवल 1 की आवश्यकता होती है।
सिद्धांत आपको डॉक्टरेट क्वेरी भाषा का उपयोग करके इस स्थिति को अनुकूलित करने की अनुमति देता है। आप डीक्यूएल को बताते हैं कि आप एक कार ऑब्जेक्ट लोड करना चाहते हैं, लेकिन इसके मालिकों, निर्माता, शीर्षक, लीन्स इत्यादि में भी शामिल हो सकते हैं और यह उस डेटा को ऑब्जेक्ट्स में लोड करेगा।
Whew! लंबी प्रतिक्रिया। असल में, हालांकि, आप "ओआरएम का उद्देश्य क्या है?" के दिल में प्राप्त हुए हैं और "हमें एक का उपयोग क्यों करना चाहिए?" ओआरएम हमें ऑब्जेक्ट मोड में ज्यादातर बार सोचने की इजाजत देता है, लेकिन अमूर्तता सही नहीं है और अबास्ट्रक्शन में रिसाव प्रदर्शन दंड के रूप में बाहर आती है।
एंथ्रोपोमोर्फिस कंप्यूटर न करें। वे इसे पसंद नहीं करते हैं। – finnw