2010-11-07 12 views
6

मैं PHP5 ORM की तलाश में हूं जो समग्र प्राथमिक कुंजी और विदेशी कुंजी के आधार पर समग्र (बहु-कॉलम) संबंधों का पूर्ण समर्थन करता है।पूर्ण समग्र प्राथमिक/विदेशी कुंजी समर्थन के साथ PHP ओआरएम

मुझे उम्मीद थी कि सिद्धांत 2 इस समस्या को हल करेगा लेकिन ऐसा नहीं है। यह डेटा मॉडलिंग के संबंध में एक मूलभूत विशेषता है लेकिन मुझे पता है कि PHP ओआरएम सॉफ़्टवेयर में से कोई भी इसका समर्थन नहीं करता है।

मैंने हाल ही में पाया है कि एसक्यूएलकेमी के पास पूर्ण समर्थन है लेकिन मुझे PHP के लिए कुछ चाहिए, पायथन नहीं।

उत्तर

1

सिद्धांत 2.1 पूरी तरह से इस समस्या को हल करता है।

0

Doctrine2 संदर्भ से:

सिद्धांत 2 समग्र प्राथमिक कुंजी का उपयोग करने के लिए अनुमति देता है। हालांकि एक पहचानकर्ता का उपयोग करने के विरोध में कुछ प्रतिबंध हैं। @GeneratedValue एनोटेशन के उपयोग केवल सरल (संयुक्त नहीं) प्राथमिक कुंजी के लिए समर्थित है, जिसका अर्थ है कि आप केवल उपयोग समग्र कुंजी कर सकते हैं अगर आप से पहले प्राथमिक कुंजी मान अपने आप को बुला EntityManager # उत्पन्न पर जारी रहती है() इकाई।

को नामित करने के लिए एक समग्र प्राथमिक कुंजी/ पहचानकर्ता, बस उस प्राथमिक कुंजी बनाने के सभी क्षेत्रों पर @Id मार्कर एनोटेशन डाल दिया।

+1

नहीं, आपकी जानकारी बेकार है। यहां तक ​​कि सिद्धांत 1 समग्र प्राथमिक कुंजी का समर्थन करता है। मुझे समग्र प्राथमिक कुंजी और समग्र विदेशी कुंजी के आधार पर बहु-स्तंभ संबंधों की आवश्यकता है। सिद्धांत 2 संदर्भ कहता है कि यह यहां इसका समर्थन नहीं करता है: http://www.doctrine-project.org/projects/orm/2.0/docs/reference/limitations-and-known-issues/en#limitations-and-known -issues – Daimon

+0

हाँ, क्षमा करें, आप सही हैं, मैंने इसे देखा है। मैं v1.2 – trix

+1

के साथ काम कर रहा था मैं अब भी डॉक्टरेट v1.2 का उपयोग कर रहा हूं। ऐसे मामलों में मैं बदसूरत सरोगेट-चाबियाँ बनाता हूं जो आवश्यक सुविधा का अनुकरण करते हैं ... लेकिन यह अच्छे संबंधपरक डेटा डिज़ाइन को खराब करता है और कम प्रदर्शन (अनावश्यक सूचकांक) में समाप्त होता है – Daimon

4

जब आप डेटाबेस परिप्रेक्ष्य से अनुप्रयोग के पास आ रहे हैं जैसे Doctrine2 (PHP) या Hibernate (Java) जिसमें से "व्युत्पन्न" है, उचित नहीं है। जब आप दूसरी तरफ जाना चाहते हैं तो ये अधिक उपयुक्त होते हैं (यानी "मेरे पास ओओ डोमेन मॉडल है और इसे एक रिलेशनल डीबी में जारी रखने की आवश्यकता है" नहीं, "मेरे पास एक रिलेशनल डीबी है और एक (जेनरेट?) ओओ इंटरफेस चाहिए इसके लिए, डेटाबेस पक्ष पर जो कुछ भी समझौता किए बिना ")। यदि आप दृष्टिकोण में इस महत्वपूर्ण अंतर के बावजूद उनका उपयोग करते हैं और आप अपने ऑब्जेक्ट मॉडल से अधिक अपने रिलेशनल स्कीमा से प्यार करते हैं तो आप निराश हो जाएंगे।

ओआरएम उपकरण की विभिन्न श्रेणियों के बीच अंतर करना वास्तव में महत्वपूर्ण है क्योंकि वे विभिन्न विकास मॉडल पर ध्यान केंद्रित करते हैं।

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

सिद्धांत कुंजी या हाइबरनेट जैसे समाधान समग्र कुंजी के उपयोग को हतोत्साहित करते हैं और इसलिए केवल उन्हें एक निश्चित स्तर तक समर्थन देते हैं (हाइबरनेट बहुत दूर जाता है लेकिन फिर भी उन्हें उपयोग करने की अनुशंसा नहीं की जाती है)।

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

+0

कृपया हाइबरनेट का उल्लेख न करें। यह डाटाबेस, विशेष रूप से समग्र कुंजी से डोमेन मॉडल बनाने में सक्षम है। –

+5

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

+1

@jpartogi: मेरी आंखों में आप रिवर्स-इंजीनियरिंग एक रिलेशनल डेटाबेस द्वारा कभी भी (अच्छा) डोमेन मॉडल नहीं बना सकते हैं, और यह हाइबरनेट के साथ समग्र कुंजी का उपयोग करने के लिए भी निराश है। प्रलेखन से उद्धरण: "एक वैकल्पिक <समग्र-आईडी> घोषणा है जो समग्र कुंजी के साथ विरासत डेटा तक पहुंच की अनुमति देती है। इसका उपयोग किसी और चीज़ के लिए दृढ़ता से निराश होता है।" मुझे पता है कि इसके लिए इसका मजबूत समर्थन है, लेकिन ज्यादातर विरासत डेटाबेस के लिए। – romanb

0

आप LEAP ORM को आजमा सकते हैं, जो कि PHP 5 में लिखा गया है। यह https://github.com/spadefoot/kohana-orm-leap पर जिथब पर उपलब्ध है।

लीप ओआरएम प्राथमिक कुंजी और विदेशी कुंजी दोनों के लिए पूरी तरह से समग्र कुंजी का समर्थन करता है। इसी तरह, यह गैर-पूर्णांक प्राथमिक/विदेशी कुंजी के साथ काम करता है। ओआरएम मॉडल के भीतर, आप फ़ील्ड उपनाम, फ़ील्ड एडेप्टर और रिलेशनशिप बना सकते हैं।

हालांकि यह Kohana PHP Framework के लिए लिखा गया है, लेकिन आप आसानी से इसे कोड में एक सरल ऑटोलोड लोड जोड़कर किसी भी PHP ढांचे के साथ काम कर सकते हैं। लीप निम्नलिखित डेटाबेस के साथ काम करता है: डीबी 2, ड्राईजल, फायरबर्ड, मारियाडीबी, एमएस एसक्यूएल, माईएसक्यूएल, ओरेकल, पोस्टग्रेएसक्यूएल, और एसक्यूएलसाइट। यह एक क्वेरी बिल्डर और डेटाबेस कनेक्शन पूल दोनों प्रदान करता है।

ओआरएम की वेबसाइट पर, इसका उपयोग करने के तरीके को समझने में सहायता के लिए बहुत अच्छे examples and tutorials हैं।

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