Mysql
 sql >> Database >  >> RDS >> Mysql

Modello EAV database, elenco record come da ricerca

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.