Mysql
 sql >> Datenbank >  >> RDS >> Mysql

So rufen Sie Werte aus einer normalisierten MySQL 5.7-Struktur ab, die bestimmten Kriterien entsprechen

Sie haben eine Entity-Attribute-Value-Tabelle verwendet, um Ihre Attribute aufzuzeichnen.

Dies ist das Gegenteil der Normalisierung.

Nennen Sie die Normalisierungsregel, die Sie dazu geführt hat, verschiedene Attribute in dieselbe Spalte einzufügen. Das können Sie nicht, da dies keine Normalisierungspraxis ist.

Um Ihre Abfrage mit Ihrem aktuellen EAV-Design auszuführen, müssen Sie das Ergebnis so drehen, dass Sie etwas erhalten, als ob Sie Ihre ursprüngliche Tabelle hätten.

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 

Während die obige Abfrage das gewünschte Ergebnis liefern kann, wird die Leistung schrecklich sein. Es muss eine temporäre Tabelle für die Unterabfrage erstellt werden, die alle Daten aus beiden Tabellen enthält , wenden Sie dann die WHERE-Klausel auf die temporäre Tabelle an.

Sie sind wirklich besser dran, wenn jedes Attribut in seiner eigenen Spalte in Ihrer ursprünglichen Tabelle steht.

Ich verstehe, dass Sie versuchen, in Zukunft viele Attribute zu berücksichtigen. Dies ist ein häufiges Problem.

Siehe meine Antwort auf Wie man eine Produkttabelle für viele Arten von Produkten entwirft, wobei jedes Produkt viele Parameter hat

Aber Sie sollten es nicht "normalisiert" nennen, weil es nicht so ist. Es ist nicht einmal denormalisiert . Es ist derelational .

Sie können nicht einfach Worte verwenden, um alles zu beschreiben, was Sie wollen – schon gar nicht das Gegenteil von dem, was das Wort bedeutet. Ich kann nicht die Luft aus meinem Fahrradreifen lassen und sagen:"Ich pumpe ihn auf."

Sie haben kommentiert, dass Sie versuchen, Ihre Datenbank "skalierbar" zu machen. Sie missverstehen auch, was das Wort "skalierbar" bedeutet. Durch die Verwendung von EAV erstellen Sie eine Struktur, in der die erforderlichen Abfragen schwierig zu schreiben und ineffizient auszuführen sind und die Daten den 10-fachen Speicherplatz beanspruchen. Es ist das Gegenteil von skalierbar.

Was Sie meinen, ist, dass Sie versuchen, ein erweiterbares System zu erstellen . Dies ist in SQL komplex zu implementieren, aber ich beschreibe mehrere Lösungen in der anderen Stack Overflow-Antwort, auf die ich verlinkt habe. Vielleicht gefällt Ihnen auch meine Präsentation Extensible Data Modeling with MySQL .