2012-10-08 13 views
14

Tôi bắt đầu chơi đùa với thư viện Doctrine ORM và Im tìm hiểu về tất cả các mối liên hệ giữa các bảng.Học thuyết - OneToOne Một chiều so với OneToOne Hai chiều

Vì vậy, Im bị kẹt với sự khác biệt trong quan hệ hai hướng và hai chiều.

Khi tôi nhận được nó, quan hệ một chiều có khóa chính chỉ ở một bên, và bên đó đang sở hữu bên phải không? Và quan hệ hai chiều có khóa chính trong cả hai bảng và do đó bạn có thể có mối quan hệ từ cả hai bên và đặt ràng buộc ở cả hai bên.

Bây giờ, Im đọc qua tài liệu về học thuyết về quan hệ và bạn có: UnidirectionalBidirectional liên kết.

Nhưng chúng tạo ra cùng một SQL và các bảng giống với cùng khóa và ràng buộc chính. Vì vậy, tôi không thực sự thấy bất kỳ sự khác biệt trong hai. Và cả hai ví dụ đều có khóa chính ở một bên.

Khi tôi nhận được nó, mối quan hệ hai chiều thực sự phải có khóa chính trong cả hai bảng trỏ đến bảng khác phải không? Và với ví dụ cụ thể về tài liệu Doctrine không phải như vậy. Cả hai ví dụ đều cho kết quả tương tự và giống nhau.

Vì vậy, những gì tôi đã làm, là điều này, cho phép nói rằng tôi có người dùng và thẻ thực thể, và muốn quan hệ là OneToOne hai chiều.

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

Sự khác biệt ở đây là tôi đã viết @JoinColumn trong cả hai đối tượng/thực thể. Và trong ví dụ Doctrine chỉ có một. Bây giờ tôi sẽ nhận được những gì tôi nghĩ là quan hệ hai chiều. Nếu tôi nhìn vào biểu đồ EER, tôi có thể thấy một dòng chỉ từ người dùng đến thẻ và một dòng khác từ thẻ này sang người dùng khác.

Vì vậy, về cơ bản tôi đã nhận được quyền này? Tài liệu Doctrine có sai không? : D Quan hệ OneToOne hai chiều trông như thế nào trong biểu đồ EER?

Cảm ơn!

+0

Bất kỳ ai? Không một ai? : D – otporan

Trả lời

12

sự khác biệt duy nhất là trong giao diện lớp PHP, tức là có sự hiện diện hay vắng mặt của bất động sản mà chỉ trở lại cho chủ sở hữu (ví dụ như $customer thuộc tính trong ví dụ Doctrine đã đề cập).Nói cách khác, Doctrine chỉ cần biết liệu cần phải quan tâm đến một tài sản ($shipping) hoặc hai thuộc tính ($cart$customer). Không có sự khác biệt nào khác. Do đó, mã SQL giống nhau (vì một khóa ngoại là đủ để biểu diễn bất kỳ mối quan hệ 1: N) và sẽ không có sự khác biệt trong sơ đồ EER (vì trong EER bạn thường không giải quyết các chi tiết thực hiện liên quan đến PHP).

9

Một chiều và hai chiều không liên quan gì đến thuật toán nền làm thế nào để tạo các kết nối này trong lớp cơ sở dữ liệu.

Tất cả những gì họ nói đến là cách kết nối có thể được sử dụng. Trong một mối quan hệ một chiều, bạn có thể truy cập mục tiêu chỉ từ một trang web. Một mối quan hệ hai chiều cho phép kết nối được gọi từ hai bên (cả hai).

Vì vậy, trong một unidir. rel. model_a có thể lấy model_b, nhưng model_b không thể tới model_a (không có thêm công việc). Nếu bây giờ bạn sử dụng một bidir. rel cả hai mô hình có thể truy cập vào nhau mà không vấn đề

Về giáo lý, một mối quan hệ một chiều xác định một phương pháp $modelA->getModelB(), nhưng không phải là một phương pháp $modelB->getModelA(), trong khi một mối quan hệ hai chiều xác định cả hai phương pháp (hoặc accessors, tuy nhiên bạn muốn gọi cho họ)

trong một sơ đồ UML nó sẽ trông như thế này:

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

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