Mysql
 sql >> Database >  >> RDS >> Mysql

Come recuperare valori da una struttura MySQL 5.7 normalizzata che soddisfa determinati criteri

Hai utilizzato una tabella Entity-Attribute-Value per registrare i tuoi attributi.

Questo è il opposto di normalizzazione.

Assegna un nome alla regola di normalizzazione che ti ha guidato a inserire attributi diversi nella stessa colonna. Non puoi, perché questa non è una pratica di normalizzazione.

Per realizzare la tua query con il tuo attuale design EAV, devi ruotare il risultato in modo da ottenere qualcosa come se avessi la tua tabella originale.

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 

Sebbene la query di cui sopra possa produrre il risultato desiderato, le prestazioni saranno terribili. Deve creare una tabella temporanea per la sottoquery, contenente tutti i dati di entrambe le tabelle , quindi applica la clausola WHERE alla tabella temporanea.

Stai davvero meglio con ogni attributo nella sua colonna nella tabella originale.

Capisco che stai cercando di consentire molti attributi in futuro. Questo è un problema comune.

Vedi la mia risposta aCome progettare una tabella prodotti per molti tipi di prodotti in cui ogni prodotto ha molti parametri

Ma non dovresti chiamarlo "normalizzato", perché non lo è. Non è nemmeno denormalizzato . È derelazionale .

Non puoi semplicemente usare le parole per descrivere tutto ciò che vuoi, specialmente non il contrario di ciò che significa la parola. Non posso far uscire l'aria dalla mia ruota della bicicletta e dire "Lo sto gonfiando".

Hai commentato che stai cercando di rendere il tuo database "scalabile". Fraintendi anche il significato della parola "scalabile". Usando EAV, stai creando una struttura in cui le query necessarie sono difficili da scrivere e inefficienti da eseguire e i dati occupano 10 volte lo spazio. È l'opposto di scalabile.

Intendi dire che stai cercando di creare un sistema che sia estensibile . Questo è complesso da implementare in SQL, ma descrivo diverse soluzioni nell'altra risposta di Stack Overflow a cui ho collegato. Potrebbe piacerti anche la mia presentazione Modellazione estensibile dei dati con MySQL .