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 entity
và attribute
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 attribute
và value
? 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 name
và phone_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ụ: Name
và PhoneNumber
) 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 attribute
và value
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.
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
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. –