Mysql
 sql >> база данни >  >> RDS >> Mysql

Модел на база данни EAV, списък на записите според търсенето

Дизайнът на EAVе денормализиран. Тоест, това е нерелационен дизайн. Няма правило за нормализиране, което да ви накара да използвате дизайна на EAV.

SQL изисква да знаете колоните, когато пишете заявката, както и всеки ред от резултантния набор да има същите колони. С EAV единственото решение, ако не знаете колко полета на елемент, е да ги извлечете обратно като редове, а не като колони.

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;

Трябва да обработите редовете във вашето приложение. Например с 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"];
}

Сега имате масив от обекти и всеки обект съответства на елемент от базата данни. Всеки обект има свой собствен набор от полета.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL и LIKE сравнение с %

  2. MySQL структура за преводи

  3. Spring Boot JPA:как да направите заявка за JSON колона в таблица

  4. Трябва ли да деактивирам стриктния режим на MySQL?

  5. Как да разберете състоянието на репликация на MySQL с помощта на заявка за избор?