Дизайн EAV денормализован . То есть это нереляционный дизайн. Нет правила нормализации, которое привело бы вас к использованию дизайна EAV.
SQL требует, чтобы вы знали столбцы при написании запроса, а также чтобы в каждой строке набора результатов были одинаковые столбцы. В случае EAV единственным решением, если вы не знаете, сколько полей на элемент, является выборка их в виде строк, а не столбцов.
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;
Вы должны обработать строки в вашем приложении. Например, с 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"];
}
Теперь у вас есть массив объектов, и каждый объект соответствует элементу из базы данных. Каждый объект имеет свой соответствующий набор полей.