Das EAV-Design ist denormalisiert. Das heißt, es ist ein nicht relationales Design. Es gibt keine Normalisierungsregel, die Sie dazu bringen würde, das EAV-Design zu verwenden.
SQL erfordert, dass Sie die Spalten kennen, wenn Sie die Abfrage schreiben, und dass jede Zeile der Ergebnismenge dieselben Spalten enthält. Mit EAV besteht die einzige Lösung, wenn Sie nicht wissen, wie viele Felder pro Element vorhanden sind, darin, sie als Zeilen und nicht als Spalten abzurufen.
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;
Sie müssen die Zeilen in Ihrer Anwendung verarbeiten. Zum Beispiel mit 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"];
}
Jetzt haben Sie ein Array von Objekten, und jedes Objekt entspricht einem Element aus der Datenbank. Jedes Objekt hat seinen eigenen entsprechenden Satz von Feldern.