EAV-designet er denormaliseret. Det vil sige, det er et ikke-relationelt design. Der er ingen normaliseringsregel, der ville få dig til at bruge EAV-designet.
SQL kræver, at du kender kolonnerne, når du skriver forespørgslen, og at hver række i resultatsættet har de samme kolonner. Med EAV er den eneste løsning, hvis du ikke ved, hvor mange felter pr. element, at hente dem tilbage som rækker, ikke kolonner.
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 skal behandle rækkerne i din ansøgning. For eksempel 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 række objekter, og hvert objekt svarer til et element fra databasen. Hvert objekt har sit eget respektive sæt felter.