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

Jak získat hodnoty z normalizované struktury MySQL 5.7, které odpovídají určitým kritériím

K zaznamenání atributů jste použili tabulku Entity-Attribute-Value.

Toto je opak normalizace.

Pojmenujte pravidlo normalizace, které vás vedlo k vkládání různých atributů do stejného sloupce. Nemůžete, protože to není normalizační praxe.

Chcete-li svůj dotaz splnit se svým aktuálním návrhem EAV, musíte výsledek otočit, abyste získali něco, jako byste měli svou původní tabulku.

SELECT * FROM (
    SELECT 
         a.article_id,
         a.title, 
         MAX(CASE attr_group WHEN 'ref_id' THEN attribute END) AS ref_id,
         MAX(CASE attr_group WHEN 'dial_c_id' THEN attribute END) AS dial_c_id
         -- ...others...
    FROM test.articles_test a
    INNER JOIN attributes attr ON a.article_id = attr.article_id
    GROUP BY a.article_id, a.title) AS pivot
WHERE pivot.ref_id = '127712' 
  AND pivot.dial_c_id = 51 

Zatímco výše uvedený dotaz může přinést požadovaný výsledek, výkon bude hrozný. Musí vytvořit dočasnou tabulku pro poddotaz obsahující všechna data z obou tabulek a poté použijte klauzuli WHERE na dočasnou tabulku.

Jste na tom opravdu lépe s každým atributem ve vlastním sloupci v původní tabulce.

Chápu, že se v budoucnu snažíte povolit mnoho atributů. Toto je běžný problém.

Viz moje odpověď na Jak navrhnout tabulku produktů pro mnoho druhů produktů, kde každý produkt má mnoho parametrů

Ale neměli byste tomu říkat „normalizované“, protože tomu tak není. Není ani denormalizováno . Je to derrelační .

Nemůžete jen používat slova k popisu čehokoli, co chcete – zvláště ne opak toho, co slovo znamená. Nemohu vypustit vzduch z pneumatiky na jízdním kole a říct „Nafukuji to.“

Komentoval jste, že se snažíte učinit svou databázi „škálovatelnou“. Také špatně chápete, co znamená slovo „škálovatelný“. Použitím EAV vytváříte strukturu, kde se potřebné dotazy obtížně zapisují a jsou neefektivní pro provádění a data zabírají 10x místo. Je to opak škálovatelného.

Máte na mysli, že se snažíte vytvořit systém, který je rozšiřitelný . Toto je složité implementovat v SQL, ale několik řešení popisuji v jiné odpovědi Stack Overflow, na kterou jsem odkazoval. Také by se vám mohla líbit moje prezentace Extensible Data Modeling with MySQL .




  1. Vypočítejte počet sekund od určitého data/času v SQLite

  2. Pomocí indexu, pomocí dočasných, pomocí řazení souborů - jak to opravit?

  3. MySQL z_unixtime po 2038-01-19?

  4. SQL Server:Filtr výstup sp_who2