Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Modelo EAV de banco de dados, listagem de registros conforme pesquisa


O design do EAV é desnormalizado. Ou seja, é um design não relacional. Não existe uma regra de normalização que o leve a usar o design EAV.

O SQL requer que você conheça as colunas ao escrever a consulta e também que cada linha do conjunto de resultados tenha as mesmas colunas. Com EAV, a única solução se você não souber quantos campos por item é buscá-los de volta como linhas, não colunas.
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;

Você precisa processar as linhas em seu aplicativo. Por exemplo, com 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"];
}

Agora você tem um array de objetos, e cada objeto corresponde a um item do banco de dados. Cada objeto tem seu próprio conjunto de campos.