Desain EAV adalah didenormalisasi. Artinya, ini adalah desain non-relasional. Tidak ada aturan normalisasi yang akan mengarahkan Anda untuk menggunakan desain EAV.
SQL mengharuskan Anda mengetahui kolom saat menulis kueri, dan juga setiap baris kumpulan hasil memiliki kolom yang sama. Dengan EAV, satu-satunya solusi jika Anda tidak tahu berapa banyak bidang per item adalah mengambilnya kembali sebagai baris, bukan kolom.
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;
Anda harus memproses baris dalam aplikasi Anda. Misalnya, dengan 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"];
}
Sekarang Anda memiliki array objek, dan setiap objek sesuai dengan item dari database. Setiap objek memiliki kumpulan bidangnya masing-masing.