Дизайнът на 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"];
}
Сега имате масив от обекти и всеки обект съответства на елемент от базата данни. Всеки обект има свой собствен набор от полета.