2012-12-05 14 views
9

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

मैं PHP के साथ काम कर रहा हूं इसलिए कोड के उदाहरण जो मैं रखूंगा वो PHP में हैं।

मान लें कि मेरे पास एक टेबल "टीम" (आईडी, नाम) और एक टेबल "प्लेयर" (आईडी, नाम, team_id) है। यह 1-एन संबंध है। डेटा मैपर पैटर्न को लागू करके, हमारे पास निम्नलिखित कक्षाएं होंगी: टीम, टीममैपर, प्लेयर और प्लेयरमैपर।

अभी तक, सबकुछ सरल है। क्या होगा यदि हम सभी खिलाड़ियों को एक टीम से प्राप्त करना चाहते हैं?

मुझे मिला पहला समाधान टीम क्लास में एक विधि getAllPlayers() बनाने के लिए है जो आलसी लोडिंग और प्रॉक्सी के साथ संभाल लेंगे। फिर हम उस तरह एक टीम के खिलाड़ियों को पुनः प्राप्त कर सकते हैं:

$players = $team->getAllPlayers(); 

दूसरा समाधान मैंने पाया सीधे PlayerMapper का उपयोग करें और पैरामीटर के रूप में टीम आईडी पारित करने के लिए है। की तरह कुछ:

$playerMapper->findAll(array('team_id' => $team->getId())); 

लेकिन अब, मान लें कि मैं सभी टीमों के साथ और प्रत्येक टीम के खिलाड़ियों के सभी के साथ एक कॉलम 'प्लेयर्स' के साथ एक HTML तालिका प्रदर्शित करने के लिए चाहते हैं। यदि हम वर्णन किए गए पहले समाधान का उपयोग करते हैं, तो हमें टीमों की सूची प्राप्त करने के लिए एक एसक्यूएल क्वेरी करना होगा और खिलाड़ियों को प्राप्त करने के लिए प्रत्येक टीम के लिए एक प्रश्न, whcih का मतलब एन + 1 एसक्यूएल प्रश्न है जहां एन टीमों की संख्या है।

अगर हम दूसरे समाधान मैं वर्णित का उपयोग, हम पहले, सभी टीम आईडी प्राप्त कर सकते हैं उन्हें एक सरणी में डाल दिया, और उसके बाद, खिलाड़ी नक्शाकार की findAll विधि करने के लिए इसे पारित ऐसा ही कुछ:

$playerMapper->findAll(array('team_id' => $teamIds)); 

उस स्थिति में, हमें केवल 2 प्रश्नों को चलाने की आवश्यकता है। काफी बेहतर। लेकिन मैं अभी भी उस समाधान से बहुत खुश नहीं हूं क्योंकि संबंधों को मॉडल में वर्णित नहीं किया गया है और यह डेवलपर है जो उनके बारे में जानना चाहिए।

तो मेरा सवाल है: क्या डेटा मैपर पैटर्न के साथ अन्य विकल्प हैं? उदाहरण के साथ, क्या मॉडल में संबंधों के विवरण के साथ केवल 2 प्रश्नों में सभी खिलाड़ियों के साथ सभी टीमों का चयन करने का एक अच्छा तरीका है?

अग्रिम धन्यवाद!

उत्तर

2

यदि आप मार्टिन फाउलर के पाठ को देखते हैं जो वर्णन करता है कि डेटामैपर कैसे काम करता है, तो आप देखेंगे कि आप एक डेटा का उपयोग कर सकते हैं ताकि आपको आवश्यक सभी डेटा प्राप्त हो सके और फिर उस डेटा को प्रत्येक मैपर में पास कर दें, जिससे मैपर को चुनने की अनुमति मिल सके। केवल उस डेटा को बाहर निकालें जिसकी आवश्यकता है।

आपके लिए, यह एक प्रश्न होगा जो टीम से प्लेयर में शामिल हो जाएगा, प्रत्येक अद्वितीय प्लेयर के लिए डुप्लीकेट टीम डेटा के साथ एक परिणामसेट लौटाएगा।

आपको डेटा बदलते समय केवल नए ऑब्जेक्ट्स बनाकर अपने मैपिंग कोड में डुप्लिकेशन के लिए पूरा करना होगा।

मैंने कुछ ऐसा ही किया है जहां परिणाम सेट पर पुनरावृत्ति टीम मैपर होगा और प्रत्येक अद्वितीय टीम के परिणामस्वरूप प्लेयर मैपर पर परिणाम सेट हो जाएगा ताकि वह एक खिलाड़ी बना सके और फिर प्लेयर को जोड़ सके टीम का संग्रह।

यह काम करते हैं, वहाँ इस दृष्टिकोण आगे बहाव के साथ समस्याएं हैं ...

+0

कौन सा मार्टिन फाउलर का पाठ आप संदर्भित करते हैं? मुझे मिला एकमात्र ऐसा है (http://www.martinfowler.com/eaaCatalog/dataMapper.html) और मुझे आपके बारे में कुछ भी दिखाई नहीं देता है। वैसे भी, यह दृष्टिकोण मुझे विश्वास नहीं करता है। इसका मतलब है कि आपको बहुत सारे डुप्लिकेट डेटा के साथ एनएक्सएम पंक्तियों (एन टीमों की संख्या और एम खिलाड़ियों की संख्या के साथ) को वापस करने के लिए एक प्रश्न करना है। और इसका मतलब टीम मैपर के माध्यम से खिलाड़ियों को मैप करना भी है जो इतना अच्छा नहीं लगता है। और जैसा कि आपने कहा, मुझे यकीन है कि इस दृष्टिकोण के साथ और नीचे की समस्याएं हैं ... – Vincent

+0

यह पीओईएए पुस्तक में है। वेबसाइट केवल एक सिंहावलोकन प्रदान करता है। आपकी क्वेरी एनएक्सएम पंक्तियों, केवल एम पंक्तियों को वापस नहीं करती है। यह बहुत सारे डेटा वापस लाता है, लेकिन यह बात है। एक गोल यात्रा जितना संभव हो उतना पकड़ो। इसके अलावा, आपकी टीम मैपर प्लेयर्स को मैप नहीं करती है, यह प्लेयर मैपर से इसके लिए खिलाड़ियों को मैप करने के लिए कहती है। –

+0

हाँ, क्षमा करें, एम पंक्तियां। खैर, यह एक समाधान है लेकिन मैं अभी भी पूरी तरह से आश्वस्त नहीं हूं। चलो देखते हैं कि मेरा प्रश्न अधिक जवाब लाएगा ... – Vincent

0

मैं इस समस्या यह है कि मैं अपनी परियोजनाओं में से एक में सफलतापूर्वक लागू किया है करने के लिए एक संभव समाधान है। यह इतना जटिल नहीं है और ऊपर वर्णित उदाहरण में केवल 2 प्रश्नों का उपयोग करेगा।

समाधान संबंधों को संभालने के लिए जिम्मेदार कोड की एक और परत जोड़ना है।

उदाहरण के लिए, हम इसे एक सेवा कक्षा में डाल सकते हैं (जिसका उपयोग अन्य सामानों के लिए भी किया जा सकता है, न केवल संबंधों को संभालने)। तो मान लें कि हमारे पास टीम और टीममैपर के शीर्ष पर एक क्लास टीम सेवा है। टीम सेवा के पास एक तरीका होगा टीम्स विथ रिलेशनशिप() जो टीम ऑब्जेक्ट्स की एक सरणी वापस कर देगा। getTeamsWithRelationships() टीमों की सूची प्राप्त करने के लिए TeamMapper का उपयोग करेगा। फिर, प्लेयरमैपर के साथ, इन टीमों के लिए खिलाड़ियों की सूची में केवल एक ही प्रश्न मिलेगा और खिलाड़ियों को टीम क्लास से सेटप्लेयर() विधि का उपयोग कर टीमों में सेट किया जाएगा।

यह समाधान काफी सरल और कार्यान्वित करने में आसान है, और यह सभी प्रकार के डेटाबेस संबंधों के लिए अच्छा काम करता है। मुझे लगता है कि कुछ लोगों के खिलाफ कुछ हो सकता है। यदि हां, तो मुझे यह जानने में दिलचस्पी होगी कि क्या मुद्दे हैं?

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