sql >> Databáze >  >> RDS >> Mysql

Databáze EAV model, výpis záznamů podle vyhledávání

Design EAV je denormalizované. To znamená, že jde o nerelační design. Neexistuje žádné pravidlo normalizace, které by vás vedlo k použití návrhu EAV.

SQL vyžaduje, abyste při psaní dotazu znali sloupce a také, aby každý řádek sady výsledků měl stejné sloupce. S EAV je jediným řešením, pokud nevíte, kolik polí na položku je načíst je zpět jako řádky, nikoli sloupce.

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;

Musíte zpracovat řádky ve vaší aplikaci. Například s 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"];
}

Nyní máte pole objektů a každý objekt odpovídá položce z databáze. Každý objekt má svou vlastní sadu polí.




  1. Hledání simultánních událostí v databázi mezi časy

  2. Vytvoření dynamického spouštěče Mysql v uložené proceduře

  3. Jak navrhnout databázi mysql pro více tenantů

  4. Syntaxe MySQL při vytváření cizího klíče