sql >> Database >  >> RDS >> Mysql

Database EAV-model, recordlijst volgens zoekopdracht

Het EAV-ontwerp is gedenormaliseerd. Dat wil zeggen, het is een niet-relationeel ontwerp. Er is geen regel voor normalisatie die ertoe zou leiden dat u het EAV-ontwerp gebruikt.

SQL vereist dat u de kolommen kent wanneer u de query schrijft, en ook dat elke rij van de resultatenset dezelfde kolommen heeft. Met EAV is de enige oplossing als u niet weet hoeveel velden per item, ze terug te halen als rijen, niet als kolommen.

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;

U moet de rijen in uw aanvraag verwerken. Bijvoorbeeld met 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"];
}

Nu heb je een array van objecten, en elk object komt overeen met een item uit de database. Elk object heeft zijn eigen respectievelijke set velden.




  1. Een opgeslagen procedure plannen in MySQL

  2. SCD-type 4

  3. Query's uitvoeren waarvoor metagegevenssleutel niet bestaat

  4. Uitgebreide gebeurtenissen gebruiken om verouderde functies vast te leggen die worden gebruikt in een SQL Server-instantie (T-SQL-voorbeeld)