MySQL: Viele Tabellen dynamisch JOINen

joobie

Mitglied
Ich stehe vor diesem Problem und bin mit meinem MySQL-Latein ziemlich am Ende. Könnte mir einer von Euch Datenbank-Veteranen etwas weiterhelfen?

Folgende Situation (abstrahiert)
- es gibt eine Unmenge verschiedener Produktkategorien, auf die die Applikation zugreifen soll
- jede Kategorie enthält eine Unmenge verschiedener Produkte
- Produktkategorien werden laufend hinzugefügt
- Produkte werden laufend hinzugefügt
- die App hat verschiedene Bereiche, die jeweils eine bestimmte Gruppe von mehreren Kategorien umfasst (Elternkategorien)
- das Skript soll für jede Elternkategorie die letzten 30 Produkte aus allen (dieser Elternkategorie zugeordneten) Produktkategorien ziehen

Ich habe die DB-Struktur so angelegt, dass jede Produktkategorie eine eigene Tabelle ist, die die einzelnen Produkte enthält. Kommt irgendwann eine neue Produktkategorie hinzu, so wird eine neue Tabelle dafür angelegt, und dieser neue Tabellenname in der Elternkategorien-Tabelle der entsprechenden Elternkategorie zugeordnet.

Kompliziert, ich weiß :p

Wie würde ich so ein SELECT-Statement in PHP formulieren? Hier ist der logische Zusammenhang als einzelne queries:

1. Ziehe alle Produktkategorien (foreign IDs) der gegebenen Elternkategorie und schreibe sie in das PHP-Objekt $prod_cats:
Code:
SELECT prodcat FROM cats WHERE parentcat = 'office'

2. Ziehe die letzten 30 Produkte aus jeder einzelnen dieser Produktkategorien:
PHP:
$products = array();
foreach($prod_cats as $cat) {
   $query = "SELECT * FROM $cat->prodcat ORDER BY id DESC LIMIT 30";
   $products[] = $db->query($query);
}

Bei ca. 30-60 verschiedenen Produktkategorien pro Elternkategorie sind das dann im schlimmsten Fall 61 einzelne Datenbank-Queries. Das kann u.U. schon etwas dauern, würde ich sagen. Da muss es doch eine elegantere Methode geben, oder nicht? Z.B. mit einem Join, nur dass ich keine Ahnung habe, wie ich das mit dynamischen Produktkategorien hinkriegen soll. Und - habe ich die Datenbank für sowas überhaupt richtig angelegt?

In froher Erwartung - Danke im Voraus für jede Hilfe.
 
Pro Kategorie eine Tabelle?
Schlechte Idee.

Ein Tabelle mit der Kategorie als Fald vereinfacht das Programmieren und ist mit grösster wahrscheinlichkeit performanter für die Suche über mehrere Kategorien
 
Danke für die Antwort yaslaw. Wird es denn dann nicht schwierig beim Abfragen einer solch großen Tabelle? Oder ist es tatsächlich so dass eine einzelne Abfrage einer großen Tabelle mehrfachen Queries kleiner Tabellen vorzuziehen ist...
 
Was heisst gross? Wir reden von einigen 10'000 bis Millionen Datensätze. Darunter ist klein.

Jeder Query-Aufruf bracuht performance. Mit guten Indexen und sauberen Queries ist es fast sicher schneller als viele kleine Tabellen.

Zudem sollten Tabellen möglichst statisch sein. Das erleichtert die Arbeit damit ungemein.
 
Perfekt umschrieben, vielen Dank dafür. Das gehört definitiv in die Kategorie "hab' ich schon ewig eine Antwort für gesucht, aber nie finden können". Jetzt weiß ich Bescheid und werde es auch so machen - es sind weit unter 10k Datensätze. Die Frage nach der foreach-Schleife erübrigt sich damit auch.

Eins noch dazu: Wenn ich alte Datensätze aus der Tabelle lösche, sollte ich den Index rebuilden, oder ist es egal ob der Primary Key nicht in Inkrementen von 1 ist?

Danke nochmal für Deine Hilfe.
 
Der Primary Key kann beinhalten was er will (ausser das er eindeutig sein muss).
Den Index neu bilden lohnt sich erst nach grösseren Datenänderungen wobei der Inhalt der Fleder nicht ändern sollte, da du ja ev. Referenzen aus anderen Tabellen drin hast.
 
Zurück