2012-10-08 51 views
14

मैंने डॉक्टिन ओआरएम लाइब्रेरी के साथ खेलना शुरू किया, और मैं टेबल के बीच सभी संगठनों के बारे में सीख रहा हूं।सिद्धांत - OneToOne यूनिडायरेक्शनल बनाम OneToOne बिडरेक्शनल

तो मैं यूनिडायरेक्शनल और बिडरेक्शनल रिलेशनशिप में अंतर के साथ फंस गया।

जैसा कि मुझे मिलता है, यूनिडायरेक्शनल संबंध में केवल एक तरफ प्राथमिक कुंजी होती है, और वह पक्ष सही पक्ष का मालिक है? और बिडरेक्शनल संबंध दोनों टेबलों में प्राथमिक कुंजी है और इसलिए आप दोनों तरफ से संबंध रख सकते हैं, और दोनों तरफ बाधाएं सेट कर सकते हैं।

अब, मैं संबंधों के बारे में सिद्धांत दस्तावेज के माध्यम से पढ़ रहा हूं और वहां आपके पास है: Unidirectional और Bidirectional संघ।

लेकिन वे एक ही एसक्यूएल, और समान प्राथमिक कुंजी और बाधाओं के साथ एक ही टेबल का उत्पादन करते हैं। इसलिए मैं उन दोनों में वास्तव में कोई अंतर नहीं देखता हूं। और दोनों उदाहरणों में एक तरफ प्राथमिक कुंजी है।

जैसा कि मुझे यह सच है कि बिडरेक्शनल संबंध में अन्य तालिकाओं को इंगित करने वाली दोनों सारणी में प्राथमिक कुंजी होनी चाहिए? और सिद्धांत दस्तावेज पर दिए गए उदाहरण के साथ जो मामला नहीं है। दोनों उदाहरण एक ही परिणाम देते हैं और वही हैं।

तो मैंने जो किया, यह है, मान लीजिए कि मेरे पास उपयोगकर्ता और कार्ड इकाई है, और एक वनोन बिडरेक्शनल होने का संबंध चाहते हैं।

/** 
* @Entity 
* @Table(name="users") 
*/ 

class User 
{ 
    /** 
    * @Id 
    * @GeneratedValue 
    * @Column(type="bigint") 
    */ 
    protected $id; 

    /** 
    * @OneToOne(targetEntity="Card", mappedBy="User") 
    * @JoinColumn(name="card_id", referencedColumnName="id") 
    */ 
    protected $card; 

    /** 
    * @Column(name="user_name", type="string") 
    */ 
    protected $userName; 

    /** 
    * @Column(name="user_pass", type="string") 
    */ 
    protected $userPass; 
} 

    /** 
* @Entity 
* @Table(name="cards") 
*/ 

class Card 
{ 
    /** 
    * @Id 
    * @GeneratedValue 
    * @Column(type="bigint") 
    */ 
    protected $id; 

    /** 
    * @OneToOne(targetEntity="User", inversedBy="Card") 
    * @JoinColumn(name="user_id", referencedColumnName="id") 
    */ 
    protected $user; 

    /** 
    * @Column(name="post_title", type="string") 
    */ 
    protected $cardType; 
} 

यहां अंतर यह है कि मैंने दोनों वस्तुओं/संस्थाओं में @ जॉइन कॉलम लिखा है। और सिद्धांत उदाहरण में केवल एक ही है। अब मुझे लगता है कि बिडरेक्शनल संबंध है जो मुझे लगता है। अगर मैं ईईआर आरेख को देखता हूं, तो मैं उपयोगकर्ता से कार्ड पर इंगित करने वाली एक पंक्ति देख सकता हूं, और दूसरा कार्ड से उपयोगकर्ता तक।

तो क्या मुझे मूल रूप से यह अधिकार मिला? क्या सिद्धांत दस्तावेज गलत है? : डी ईआईआर आरेख में बिडरेक्शनल वनटोन संबंध कैसे दिखता है?

धन्यवाद!

+0

कोई भी? कोई नहीं? : डी – otporan

उत्तर

12

फर्क सिर्फ इतना है (उपस्थिति या संपत्ति के अभाव है कि मालिक को वापस अंक में, पीएचपी वर्ग इंटरफ़ेस में है यानी जैसेउल्लिखित सिद्धांत उदाहरण मेंसंपत्ति)।दूसरे शब्दों में सिद्धांत को सिर्फ यह जानने की जरूरत है कि क्या उसे एक ही संपत्ति ($shipping) या दो गुणों ($cart और $customer) के बारे में ध्यान रखना चाहिए। कोई और अंतर नहीं है। इसलिए, एसक्यूएल कोड वही है (क्योंकि एक विदेशी कुंजी किसी भी 1: एन रिश्ते का प्रतिनिधित्व करने के लिए पर्याप्त है) और ईईआर आरेख में कोई फर्क नहीं पड़ता है (क्योंकि ईईआर में आप आमतौर पर ऐसे PHP से संबंधित कार्यान्वयन विवरण हल नहीं करते हैं)।

9

यूनिडायरेक्शनल और बिडरेक्शनल के पास पृष्ठभूमि परत में इन कनेक्शन को बनाने के लिए पृष्ठभूमि एल्गोरिदम के साथ कुछ लेना देना नहीं है।

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

तो एक unidir में। rel। model_a model_b पर जा सकता है, लेकिन model_b मॉडल_ए (अतिरिक्त काम के बिना) तक नहीं पहुंच सकता है। यदि आप अब एक बिडिर का उपयोग करते हैं। दोनों मॉडलों rel समस्याओं

सिद्धांत संदर्भ में बिना एक दूसरे का उपयोग कर सकते हैं, एक यूनिडायरेक्शनल संबंध जबकि एक द्विदिश रिश्ते दोनों तरीकों को परिभाषित करता है, एक $modelA->getModelB() विधि है, लेकिन नहीं एक $modelB->getModelA() पद्धति निर्धारित करता है (या accessors, हालांकि आप उन्हें कॉल करना चाहते हैं)

एक यूएमएल आरेख यह इस प्रकार दिखाई देगा में

:

unidirectional 
modelA --X------> modelB 

bidirectional 
modelA <--------> modelB