Thiết kế EAV is không chuẩn hóa. Đó là, đó là một thiết kế không quan hệ. Không có quy tắc chuẩn hóa nào dẫn bạn đến việc sử dụng thiết kế EAV.
SQL yêu cầu bạn biết các cột khi bạn viết truy vấn và mọi hàng của tập kết quả đều có các cột giống nhau. Với EAV, giải pháp duy nhất nếu bạn không biết có bao nhiêu trường cho mỗi mục là tìm nạp chúng trở lại dưới dạng hàng, không phải cột.
SELECT i.ItemID, i.ItemName, f.FieldName, v.Value
FROM Items i
JOIN FieldsValues v4 ON (v4.ItemID, v4.FieldID, v4.Value) = (i.ItemID, 4, TRUE)
JOIN FieldsValues v ON i.ItemID = v.ItemID
JOIN Fields f ON v.FieldID = f.FieldID;
Bạn phải xử lý các hàng trong ứng dụng của mình. Ví dụ, với PHP:
<?php
$pdo = new PDO(...);
$sql = "...above query...";
$collection = array();
foreach ($pdo->query($sql) as $row) {
$id = $row["ItemID"];
if (!array_key_exists($id, $collection)) {
$collection[$id] = new stdClass();
$collection[$id]->Name = $row["ItemName"];
}
$collection[$id]->$row["FieldName"] = $row["Value"];
}
Bây giờ bạn có một mảng các đối tượng và mỗi đối tượng tương ứng với một mục từ cơ sở dữ liệu. Mỗi đối tượng có nhóm trường tương ứng của riêng nó.