Joah.: Optimierung von SELECTS über mehrere Tabellen

Hallo,

ich bräuchte mal eure Hilfe. Ich schreibe gerade an einem Anzeigenmarkt. Hier habe ich verschiedene Rubriken (Autos, Immobilien, etc.)

Zu jeder Anzeige gibt es Merkmale wie im Falle Autos Klimaanlage, Katalysator, elektrische Fensterheber, momentan habe ich 3 diese werden aber auch ca. 20 erweitert (Innenfarbe, Aussenfarbe, Anzahl Türen, etc.)

Hier mein Statement, es funktioniert einwandfrei. Ich habe nur Sorgen wegen der Performance:

SELECT a.*, melfh.wert AS elfh, mklima.wert AS klima, mkat.wert as kat
FROM
auto_anzeigen a LEFT JOIN mklima ON (mklima.anzeigenid=a.anzeigenid) LEFT JOIN melfh ON (a.anzeigenid=melfh.anzeigenid) LEFT JOIN mkat ON (a.anzeigenid=mkat.anzeigenid)

Dieses kann ich erweiteren mit einer WHERE CLAUSE
WHERE a.anzeigenid = "1"
WHERE melfh.wert=1 AND mklima.wert=1

Über eine Suchmaske möchte ich z.B. jetzt im Automarkt nach Autos suchen, die elektrische Fenster, eine Klimaanlage sowie einen Kat haben, da komme ich um die Verknüpfung der Tabellen ja nicht drumherum oder?
Wäre das hier sinnvoller das über einen EQUI JOIN aufzubauen?

Was haltet ihr davon?

Danke für eure Hilfe.

Joah.

  1. yo,

    Was haltet ihr davon?

    falsches datendesign. noch mal in sich gehen und alle entitäten ausfindig machen. diese dann miteinander verknüpfen. da erledigt sich die problematik der abfrage auch von ganz alleine.

    Ilja

    1. falsches datendesign. noch mal in sich gehen und alle entitäten ausfindig machen. diese dann miteinander verknüpfen. da erledigt sich die problematik der abfrage auch von ganz alleine.

      Wie meinst du das? Gib mir mal einen Tip, vielleicht kann ich dir dann folgen was du meinst.

      Gruß
      Joah.

      1. yo,

        Wie meinst du das? Gib mir mal einen Tip, vielleicht kann ich dir dann folgen was du meinst.

        dein datenbank-design ist denkbar ungünstig. so machst du für die eigenschaft katalysator eine eigene tabelle. es handelt sich hierbei aber um ein attribut der entität auto. so wirst du dir die 20 tabellen ersparen können, indem du nur eine einzige tabelle auto machst und dort die attribute wie katalysator(spalte) mit aufnimmst. es gibt sicherlich noch andere mögliche, dein daten-design umzusetzen. aber deine lösung ist ganz verquer. ;-)

        Ilja

        1. dein datenbank-design ist denkbar ungünstig. so machst du für die eigenschaft katalysator eine eigene tabelle. es handelt sich hierbei aber um ein attribut der entität auto. so wirst du dir die 20 tabellen ersparen können, indem du nur eine einzige tabelle auto machst und dort die attribute wie katalysator(spalte) mit aufnimmst. es gibt sicherlich noch andere mögliche, dein daten-design umzusetzen. aber deine lösung ist ganz verquer. ;-)

          In dem Falle sollte er IMHO auch eine Attribut Tabelle integrieren. Das wird nützlich, wenn es z.b. darum ginge eine Mehrsprachigkeit zu verwirklichen, wo dann die Attribute (oder auch die Attributwerte) unterschiedliche Bezeichungen haben können.

          Struppi.

  2. Weiter Möglichkeit, was haltet ihr von dieser?

    zuerst ein SELECT auf eine Merkmaltabelle, die zurückgegebenen AnzeigenIDs in ein Array speichern
    #SELECT * FROM merkmaltabelle1 WHERE wert=1

    dann nochmals ein SELECT auf eine weitere Merkmaltabelle mit anzeigenid IN (...,...), wieder AnzeigenIDS in ein Array speichern (bzw. überschrieben)

    danach ein einfaches SELECT (ohne auf die Merkmale zu joinen) auf die anzeigen Tabelle  wieder mit anzeigenid IN (...,...)

    Ausgabe der Resultate, hier wird es aber nahezu unmöglich zu sortieren, es sei denn die Resultate hier werden in eine temporäre Tabelle geschrieben.

    Wäre doch eigehntlich auch eine feine Lösung, oder?