2012-10-08 15 views
14

Ich habe angefangen, mit Doctrine ORM Bibliothek zu spielen, und ich lerne über alle Assoziationen zwischen Tabellen.Doktrin - OneToOne Unidirektional vs OneToOne Bidirektional

Also Im stecken mit den Unterschieden in Unidirektional und Bidirektionale Beziehung.

Wie ich es verstehe, Unidirektionale Beziehung hat Primärschlüssel nur auf einer Seite, und diese Seite besitzt Seite rechts? Und bidirektionale Beziehung haben Primärschlüssel in beiden Tabellen und daher können Sie Beziehung von beiden Seiten haben, und Beschränkungen auf beiden Seiten festlegen.

Nun, ich lese Doctrine Dokumentation über Beziehungen und dort haben Sie: Unidirectional und Bidirectional Assoziationen.

Aber sie produzieren die gleiche SQL, und die gleichen Tabellen mit den gleichen Primärschlüssel-s und Einschränkungen. Also sehe ich keinen Unterschied in diesen beiden. Und beide Beispiele haben Primärschlüssel auf einer Seite.

Wie ich es bekomme die wahre bidirektionale Beziehung sollte Primärschlüssel in beiden Tabellen auf den anderen Tisch zeigen, richtig? Und mit gegebenem Beispiel in Doctrine-Dokumentation ist das nicht der Fall. Beide Beispiele geben das gleiche Ergebnis und sind gleich.

Also was ich getan habe, ist dies, sagen wir, ich habe Benutzer und Kartenentität, und wollen Beziehung zu OneToOne Bidirektional sein.

/** 
* @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; 
} 

Der Unterschied hier ist, schrieb ich @JoinColumn in beide Objekte/Entitäten. Und in Doctrine Beispiel gibt es nur einen. Jetzt würde ich bekommen, was ich denke, ist bidirektionale Beziehung. Wenn ich mir das EER-Diagramm anschaue, sehe ich eine Zeile, die von Benutzer zu Karte zeigt, und die andere von Karte zu Benutzer.

So grundlegend habe ich das richtig verstanden? Ist die Doctrine-Dokumentation falsch? : D Wie würde die Bidirektionale OneToOne-Beziehung im EER-Diagramm aussehen?

Danke!

+0

Jeder? Niemand? : D – otporan

Antwort

12

der einzige Unterschied ist in der PHP-Klasse-Schnittstelle, dh in Gegenwart oder Abwesenheit der Eigenschaft, die an den Eigentümer zurückweist (zB die $customer Eigentum in der erwähnten Lehre Beispiel).Mit anderen Worten, Doctrine muss nur wissen, ob es sich um eine einzelne Eigenschaft ($shipping) oder zwei Eigenschaften ($cart und $customer) kümmern sollte. Es gibt keinen anderen Unterschied. Daher ist der SQL-Code derselbe (weil ein Fremdschlüssel ausreicht, um eine 1: N-Beziehung darzustellen), und es würde auch keinen Unterschied im EER-Diagramm geben (weil in EER solche PHP-bezogenen Implementierungsdetails normalerweise nicht gelöst werden).

9

Unidirektional und bidirektional haben nichts mit dem Hintergrundalgorithmus zu tun, wie diese Verbindungen in der Datenbankschicht erstellt werden.

Sie reden nur darüber, wie die Verbindungen verwendet werden können. In einer unidirektionalen Beziehung können Sie nur von einer Site auf das Ziel zugreifen. Eine bidirektionale Beziehung ermöglicht den Aufruf der Verbindung von zwei (beiden) Seiten.

Also in einem unidir. rel. model_a kann zu model_b, aber model_b kann nicht zu model_a (ohne zusätzliche Arbeit). Wenn Sie jetzt ein bidir verwenden.

In Lehre Begriffe beide Modelle rel einander ohne Probleme zugreifen können, definiert eine unidirektionale Beziehung eine $modelA->getModelB() Methode, aber keine $modelB->getModelA() Methode, während eine bidirektionale Beziehung beide Methoden definiert (oder Accessoren, wie Sie wollen, sie nennen)

in einem UML-Diagramm es würde wie folgt aussehen:

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

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