2013-01-02 19 views
8

Tôi đã lên kế hoạch tạo ứng dụng và sử dụng ORM cho các mô hình, nhưng vấn đề là, có một phần của cơ sở dữ liệu sử dụng Bảng thuộc tính-Giá trị thuộc tính.Doctrine ORM trên Bàn EAV

Tôi rất thích Doctrine ORM nhưng tôi không biết liệu có thể tạo các lớp trông giống như bất kỳ thực thể học thuyết thông thường nào không, khi bảng thực sự được nối với kiểu EAV.

Có thể sử dụng Doctrine về điều này không và nếu có thì làm cách nào?

+0

Ra khỏi hộp, tôi nghi ngờ điều đó. Bạn có thể cuộn triển khai của riêng bạn. Doctrine là khá mở rộng – ZolaKt

+0

Bởi vì các mối quan hệ bảng theo một giá trị (để tham gia bảng thuộc tính-giá trị đúng theo kiểu dữ liệu của nó) là không thể (như tôi biết), điều này khá khó khăn để thực hiện điều đó bằng Doctrine. –

Trả lời

4

chắc chắn có thể:

có mối quan hệ như thế này: Object (một đến nhiều) -> attributeValue -> Nhiều One -> AttributeType

+1

Còn nếu bạn muốn tìm nạp thuộc tính nào đó mà bạn có quan hệ trong bảng khác thì sao? – Nico

+0

Vâng, đây là vấn đề - gần như chắc chắn giải pháp duy nhất là bạn sẽ phải sử dụng một giao diện trong mã để lấy các đặc tính của thuộc tính EAV, thật không may, thêm một lớp phức tạp. –

0

Theo quan điểm của EAV nó có vẻ là hiển nhiên làm thế nào để xây dựng mối quan hệ giữa entityattribute sử dụng học thuyết. Trong trường hợp phức tạp nhất, chúng ta xử lý mối quan hệ Many to Many.

Vì vậy, giả sử chúng ta muốn ánh xạ một thuộc tính Name cho một thực thể User. Giả sử người dùng có chính xác một tên và mỗi tên thuộc về chính xác một người dùng, liên kết này có thể được lưu trữ sử dụng mối quan hệ One to One

Nhưng cách mô hình mối quan hệ giữa attributevalue? Vấn đề là các giá trị có thể có nhiều loại khác nhau hoặc thậm chí cần số lượng trường khác nhau để lưu thông tin của chúng.

Xem xét các thuộc tính namephone_number. Trong khi một tên có thể được đại diện bằng một chuỗi, một số nguyên có thể là cần thiết cho số điện thoại. Hoặc nó thậm chí còn cần thiết để không chỉ số lượng mà còn là mã vùng trong một tệp riêng biệt.

Vì EAV yêu cầu đại diện giá trị rất linh hoạt, không thể lưu trữ tất cả trong cùng một trường trong bảng cơ sở dữ liệu (bỏ qua các đốm màu, tuần tự hóa dữ liệu một cách tương tự). Do đó, hầu hết các triển khai EAV sử dụng các bảng khác nhau biểu thị các loại giá trị khác nhau.

Để đạt được sự linh hoạt như vậy, các tính năng của giáo lý Inheritance Mapping. Về cơ bản nó cho phép bạn mở rộng các thực thể học thuyết. Làm như vậy bạn chỉ định một discriminator cho từng tiểu loại thực thể của bạn:

/** 
    * @Entity 
    * @InheritanceType("JOINED") 
    * @DiscriminatorColumn(name="value_type", type="string") 
    * @DiscriminatorMap({"name" = "Name", "phone" = "PhoneNumber"}) 
*/ 
class Value 
{ 
// ... 
} 

/** @Entity */ 
class Name extends Value 
{ 
// ... 
} 

/** @Entity */ 
class PhoneNumber extends Value 
{ 
// ... 
} 

Các Value lớp cung cấp thực hiện chung cho tất cả các giá trị, ví dụ: một id. Mỗi phân lớp (ví dụ: NamePhoneNumber) mở rộng các giá trị phổ biến đó bằng các giá trị cụ thể của chúng, ví dụ: các trường bổ sung.

  • Định nghĩa một cột trong quan hệ cha mẹ lưu trữ loại giá trị.
  • @DiscriminatorMap được học thuyết sử dụng để ánh xạ loại từ @DiscriminatorColumn đến một trong các lớp đó.

Mối quan hệ giữa attributevalue có thể được chỉ định cho lớp cha. Các giá trị gọi từ thuộc tính sau đó sẽ tìm nạp tất cả các loại giá trị có thể được lọc (và xử lý) trong thời gian chạy sử dụng ví dụ instanceof.