2

Ist es möglich, diese Abfrage zu optimieren, die ich geschrieben habeWie optimiert man diese komplizierte EAV MYSQL Abfrage?

Ich habe eine Art dynamische virtuelle Datenbank erstellt, um meinen Benutzern die Möglichkeit zu geben, benutzerdefinierte Felder hinzuzufügen, ohne die Datenbankstruktur zu beeinträchtigen. Hier ist eine sehr vereinfachte Ansicht der Struktur bisher.

tables   | columns 

db_cases  | caseid 
db_structure | fieldname 
db_data  | fieldname, data, caseid 
db_names  | nameid 
  • Wir haben ein neues Feld
  • Alle Daten, die wir zum Datensatz db_structure durch Hinzufügen einer Zeile erstellen möchten db_data aufgezeichnet.
  • Namen werden in db_names gespeichert und die name_id in db_data
gespeichert

Ich versuche, die Fälle zu einer HTML-Tabelle

Hoffentlich wird der Rest selbsterklärend ist, können Sie sehen, wie unefficient es ausgegeben wird, . Kann ich dasselbe über Joins tun?

SELECT 
case_id, 
(SELECT data_field_value 
FROM db_data 
WHERE data_case_id = case_id AND data_field_name = 'casestatus' 
) AS casestatus, 
(SELECT forename_company 
FROM db_names 
WHERE name_id = (SELECT data_field_value 
        FROM db_data 
        WHERE data_case_id = case_id AND data_field_name = 'client1' 
       ) 
) AS client1_forename_company 
FROM db_cases 

Dank

+5

Ich würde beginnen, indem Sie es einrücken und es verständlich machen. – Iznogood

+5

Eine dynamische Datenbank? Sie legen also eine eigene Datenbanksemantik über eine SQL-Datenbank? Scary ... http://thedailywtf.com/Articles/The_Inner-Platform_Effect.aspx –

+11

Beginnen Sie mit dem Löschen. – Chibuzo

Antwort

1

Eigentlich ist Chibuzo Recht. Beginnen Sie, indem es :-)) Aber bevor, spielen Sie mit ihm ein wenig, es ist ein gutes Gehirn excercise, wie Schach oder etwas :-)

select 
    case_id, 
    d_status.data_field_value as case_status, 
    d_client1_name.forename_company as client1_forename_company 
from db_cases 
     join db_data as d_status 
      on d_status.data_case_id = case_id 
       AND d_status.data_field_name = 'casestatus' 
     join db_data as d_client1 
      on d_client1.data_case_id = case_id 
       AND d_client1.data_field_name = 'client1' 
     join db_names as d_client1_name 
      on d_client1_name.name_id = d_client1.data_field_value 

Ich würde erwarten, diese direkt verbindet, ohne Unterabfragen werden viel effizienter Löschen Obwohl Sie es testen müssen - es gibt oft Überraschungen in Optimierungen.

+0

Dank Tomas dies funktioniert ein Leckerbissen und blitzt jetzt durch die Abfrage, aber ich kann die Empfehlungen zu diesem Thread nicht ignorieren, dass EAV keine gute Idee ist. Abgesehen von der Menge an Code, die benötigt wird, um eine solche Datenbank zu verwalten (was bereits erledigt ist), kann ich fragen, warum solch ein Modell sehr verpönt ist? Skalierung? – amof

+0

@amof, also sagen Sie, es ist tatsächlich viel schneller als die ursprüngliche Abfrage? Wie viel? – TMS

+0

ursprünglich konnte ich die Abfrage über 2000 Fälle und 1 Feld nicht ausführen, es war Zeitüberschreitung nach 30 Sekunden, jetzt kann ich die Abfrage über 2000 Fälle und 10 Felder ausführen - es ist praktisch sofort. Welche Alternativen gibt es derzeit zu meinem Modell? – amof

Verwandte Themen