sql >> Databasteknik >  >> RDS >> Mysql

Hur man hämtar värden från en normaliserad MySQL 5.7-struktur som matchar vissa kriterier

Du har använt en Entity-Attribute-Value-tabell för att registrera dina attribut.

Detta är motsatsen av normalisering.

Nämn normaliseringsregeln som vägledde dig att lägga in olika attribut i samma kolumn. Du kan inte, eftersom detta inte är en normaliseringspraxis.

För att utföra din fråga med din nuvarande EAV-design måste du vrida resultatet så att du får något som om du hade din ursprungliga tabell.

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 

Även om ovanstående fråga kan ge det resultat du vill ha, kommer prestandan att vara fruktansvärd. Den måste skapa en tillfällig tabell för underfrågan, som innehåller all data från båda tabellerna , använd sedan WHERE-satsen mot temptabellen.

Du är verkligen bättre med varje attribut i sin egen kolumn i din ursprungliga tabell.

Jag förstår att du försöker tillåta många attribut i framtiden. Detta är ett vanligt problem.

Se mitt svar tillHur man designar en produkttabell för många typer av produkter där varje produkt har många parametrar

Men du ska inte kalla det "normaliserat", för det är det inte. Det är inte ens avnormaliserat . Det är avrelationellt .

Du kan inte bara använda ord för att beskriva vad du vill - speciellt inte motsatsen till vad ordet betyder. Jag kan inte släppa ut luften ur mitt cykeldäck och säga "Jag pumpar upp det."

Du kommenterade att du försöker göra din databas "skalbar". Du missförstår också vad ordet "skalbar" betyder. Genom att använda EAV skapar du en struktur där frågorna som behövs är svåra att skriva och ineffektiva att köra och data tar 10x utrymme. Det är motsatsen till skalbar.

Vad du menar är att du försöker skapa ett system som är utbyggbart . Detta är komplext att implementera i SQL, men jag beskriver flera lösningar i det andra Stack Overflow-svaret som jag länkade till. Du kanske också gillar min presentation Extensible Data Modeling with MySQL .




  1. Lista alla index i en SQLite-databas

  2. php-variabel i MySQL-radnamn

  3. Kontrollera om UTF-8-tecken kräver högst tre byte

  4. Mysql Skapa databas med specialtecken i namnet