EAV-designen är denormaliseras. Det vill säga, det är en icke-relationell design. Det finns ingen normaliseringsregel som skulle leda till att du använder EAV-designen.
SQL kräver att du känner till kolumnerna när du skriver frågan, och även att varje rad i resultatuppsättningen har samma kolumner. Med EAV är den enda lösningen om du inte vet hur många fält per artikel att hämta tillbaka dem som rader, inte kolumner.
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;
Du måste bearbeta raderna i din ansökan. Till exempel med 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"];
}
Nu har du en array av objekt, och varje objekt motsvarar ett objekt från databasen. Varje objekt har sin egen uppsättning fält.