sql >> Base de Datos >  >> RDS >> Mysql

Modelo EAV de base de datos, listado de registros según búsqueda

El diseño EAV es desnormalizado Es decir, es un diseño no relacional. No existe una regla de normalización que lo lleve a usar el diseño EAV.

SQL requiere que conozca las columnas cuando escribe la consulta y también que cada fila del conjunto de resultados tenga las mismas columnas. Con EAV, la única solución si no sabe cuántos campos por elemento es recuperarlos como filas, no como columnas.

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;

Tienes que procesar las filas en tu aplicación. Por ejemplo, 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"];
}

Ahora tiene una matriz de objetos y cada objeto corresponde a un elemento de la base de datos. Cada objeto tiene su propio conjunto de campos respectivo.