Il design EAV è denormalizzato. Cioè, è un design non relazionale. Non esiste una regola di normalizzazione che ti porti a utilizzare il design EAV.
SQL richiede che tu conosca le colonne quando scrivi la query e anche che ogni riga del set di risultati abbia le stesse colonne. Con EAV, l'unica soluzione se non sai quanti campi per elemento è recuperarli come righe, non come colonne.
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;
Devi elaborare le righe nella tua domanda. Ad esempio, con 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"];
}
Ora hai una matrice di oggetti e ogni oggetto corrisponde a un elemento dal database. Ogni oggetto ha il proprio rispettivo insieme di campi.