2011-07-22 20 views
10

मैं एक कमरा बुकिंग प्रणाली तैयार कर रहा हूं जिसमें नौ इकाइयां हैं, जो सभी एक-दूसरे से संबंधित हैं। इस विशिष्ट उदाहरण में मैं इकाई entry से 10-30 पंक्तियों को पुनर्प्राप्त कर रहा हूं जिसमें 25 गुण हैं। प्रत्येक प्रविष्टि में एक room है जिसमें 10 गुण हैं। मुझे सभी प्रविष्टि जानकारी के साथ-साथ entry->room->id और entry->room->name की आवश्यकता है। लेकिन ऐसा लगता है कि जब मैं Query::HYDRATE_ARRAY का उपयोग करता हूं तो यह सिद्धांत पूरे room लोड कर रहा है। यह Query::HYDRATE_OBJECT में अधिक आसानी से आलसी लोडिंग प्रतीत होता है।सिद्धांत 2 ... सर्वश्रेष्ठ हाइड्रेशन मोड?

तो, मैं सोच रहा हूँ अगर Query::HYDRATE_OBJECT मोड का उपयोग तेजी से या "बेहतर" Query::HYDRATE_ARRAY/Query::HYDRATE_SCALAR/Query::HYDRATE_SINGLE_SCALAR से है। चूंकि मैं कुछ पुराने कोड का पुन: उपयोग कर रहा हूं, इसलिए मैं का उपयोग करना चाहता हूं, लेकिन केवल तभी यदि यह एप्लिकेशन को धीमा नहीं करेगा।

उत्तर

13

मेरे 2 सेंट:

HYDRATE_OBJECT जब आप अपने वस्तुओं के साथ व्यापार तर्क का एक बहुत उपयोग करने की योजना के लिए सबसे अच्छा है। विशेष रूप से यदि आप बहुत सारे डेटा मैनिपुलेशन कर रहे हैं। यह शायद सबसे धीमा है (स्थिति के आधार पर)।

HYDRATE_ARRAY आमतौर पर तब तक आरक्षित होता है जब आपको केवल परिणाम और 1 डिग्री संबंधपरक डेटा की आवश्यकता होती है और इसे केवल प्रिंटिंग/देखने के उद्देश्यों के लिए उपयोग किया जा रहा है।

HYDRATE_NONE एक और मैं उपयोग करता हूं जब मैं केवल डेटा का एक बहुत छोटा सबसेट चुन रहा हूं (जैसे पूरी पंक्ति के बजाय एक या दो फ़ील्ड)। यह एक कच्चे क्वेरी परिणाम की तरह व्यवहार करता है।

यह भी ब्याज http://www.doctrine-project.org/2010/03/17/doctrine-performance-revisited.html

यह 1.2 डॉक्स से है की हो सकता है लेकिन मुझे लगता है हाइड्रेशन सुझावों एक अन्य महत्वपूर्ण नियम यह है कि इस श्रेणी में संबंधित है 2,0 http://doctrine.readthedocs.org/en/latest/en/manual/improving-performance.html

में लागू होते हैं: केवल वस्तुओं लाने जब आपको वास्तव में उनकी आवश्यकता होती है। सिद्धांत में ऑब्जेक्ट ग्राफ़ के बजाय "सरणी ग्राफ" लाने की क्षमता है। पहली नज़र में यह अजीब लग सकता है क्योंकि ऑब्जेक्ट-रिलेशनल मैपर का उपयोग पहली जगह क्यों करें? इसके बारे में सोचने के लिए एक सेकंड ले लो। PHP प्रकृति द्वारा एक पूर्ववर्ती भाषा है जिसे सभ्य ओओपी के लिए कई विशेषताओं के साथ बढ़ाया गया है। Arrays अभी भी सबसे कुशल डेटा संरचनाएं हैं जिनका उपयोग आप PHP में कर सकते हैं। ऑब्जेक्ट्स का सबसे अधिक मूल्य होता है जब उनका जटिल व्यावसायिक तर्क पूरा करने के लिए उपयोग किया जाता है। यह संसाधनों की बर्बादी है, जब डेटा महंगा वस्तु संरचनाओं में लिपटे हो जाता है जब आप HYDRATE_ARRAY का उपयोग करते हुए कि

का कोई लाभ नहीं है:

आप के बजाय को ध्यान में रखते होने वस्तुओं के किसी भी लाभ के बारे में सोच सकते सरणियों? आप दृश्य में व्यवसाय तर्क निष्पादित नहीं करने जा रहे हैं, है ना?

$blogPosts = $q->execute(array(1), Doctrine_Core::HYDRATE_ARRAY); 
+0

यह वास्तव में उपयोगी है: एक पैरामीटर आप अनावश्यक संसाधन का एक बहुत बचाने के लिए कर सकते हैं! बहुत बहुत धन्यवाद! – Daniel

+0

बस एक नोट। 'हाइड्रेट नहीं' अस्तित्व में प्रतीत नहीं होता है ... क्या यह 1.2 से है? मैं इसके बजाय 'HYDRATE_SCALAR' और' HYDRATE_SINGLE_SCALAR' का उपयोग कर रहा हूं। – Daniel

+0

@ डैनियल आप शायद सही हैं। मैंने केवल 1.2 का उपयोग किया है, लेकिन 'स्केलर' विधियां 'HYDRATE_NONE' के समान लाभ प्राप्त करने लगती हैं। –

संबंधित मुद्दे