La conception EAV est dénormalisé. Autrement dit, c'est une conception non relationnelle. Il n'y a pas de règle de normalisation qui vous conduirait à utiliser la conception EAV.
SQL exige que vous connaissiez les colonnes lorsque vous écrivez la requête et que chaque ligne du jeu de résultats ait les mêmes colonnes. Avec EAV, la seule solution si vous ne savez pas combien de champs par élément est de les récupérer sous forme de lignes et non de colonnes.
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;
Vous devez traiter les lignes dans votre application. Par exemple, avec 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"];
}
Vous avez maintenant un tableau d'objets, et chaque objet correspond à un élément de la base de données. Chaque objet a son propre ensemble respectif de champs.