Definieren wir doch mal n als Anzahl der Kategorien und m als Anzahl der Foren
In der Array-Variante hast Du als erste Schleife das Auslesen der Kategorien.
Sie besteht aus simplen Schreiboperationen in ein Array (1 x n)
Du hast als zweite Schleife das Auslesen der Foren.
Sie besteht aus 1 x n Operationen zum Anlegen eines Arrays, 1 x m if-Abfragen und 1 x m Schreiboperationen
Du hast die verschachtelte Schleife die zur Ausgabe da ist.
Sie besteht aus m + n Ausgaben.
Das macht im PHP-Code ein Laufzeitverhalten von 3 n + 3 m
Bei dem Code mit einem SQL-Statement gibt es eine Schleife.
Sie besteht aus n Ausgaben und n Zuweisungen. Dazu kommen m if-Abfragen und m Ausgaben.
Das macht im PHP-Code ein Laufzeitverhalten von 2 n + 2 m.
Da MySQL mittlerweile Selects cachen kann (wenn es entsprechend konfiguriert ist), ist das Laufzeitverhalten auf diesen zwei relativ statischen Tabellen gering (die Ergebnismenge ist m Zeilen lang).
Die Ergebnismengen mit 2 SQL-Statements sind zusammen m + n Zeilen lang und es werden zwei Querys gestartet.
Die größte Unbekannte bleibt, wie Du sagst, das Übertragen der Daten und ist, denke ich, sehr von der Serverinfrastruktur abhängig (PHP und DB auf einem Rechner oder auf verschiedenen mit 100 MBit, 1 GBit oder gar online mit noch langsameren Verfahren angebunden).
Du hast recht. Auch wenn es in diesem konkreten Fall nicht wichtig ist, sollte man immer auf die Performanz achten (ich hoffe, das meintest Du in diesem Fall mit optimiert Programmieren). Ich würde mich freuen, wenn das noch mal jemand testen kann. Ich habe derzeit noch kein Webserver, PHP und MySQL auf meinem frisch installierten Rechner.
Entschuldige bitte im Vorwege, wenn ich mich jetzt etwas ungepflegt ausdrücke, aber eine redundanzfreie Tabelle als Ergebnis eines Querys erhalten zu wollen ist Blödsinn.
Dann müsste man JOIN aus der Syntax verbannen.
SQL dient doch dazu, eine normalisierte Datenbank, die nicht besonders leicht zu lesen ist, mit der Abfrage in eine einzige darstellbare Tabelle zu überführen.
Das dient doch auch dazu, unabhängig von der jeweiligen Programmiersprache bereits ein brauchbares Ergebnis zu erhalten, welches direkt aus der dafür optimierten (z.B. durch Indizes und Caches) Datenbank generiert wird.
Stell Dir mal eine Adressdatenbank vor, in der die Länder in einer eigenen Tabelle abgelegt sind. Willst Du diese nicht direkt über einen JOIN einbinden, sondern hinterher mit der Anwendungs-Programmiersprache heraussuchen, damit Du redundanzfreie Ergebnistabellen erhältst?
Die Normalisierung dient in erster Linie dem redundanzfreien Speichern, um Dateninkosistenzen zu vermeiden. Tabellen, die zum Zweck der Ausgabe erzeugt werden haben damit nichts zu tun.
Das Ergebnis der SQL-Abfrage ist eben keine Tabelle in der Datenbank. Es ist eine Tabelle aus der Datenbank. Diese Tabelle steht alleine als Auszug der Datenbank und gehört nicht zu einem normalisierten Datenbankschema.
Gruß hpvw
PS: Der Begriff Sortieren war blöd, aber mit Zuordnen meinte ich das:
in der while-Schleife im Code von Bob dem Meister
In der Array-Variante hast Du als erste Schleife das Auslesen der Kategorien.
Sie besteht aus simplen Schreiboperationen in ein Array (1 x n)
Du hast als zweite Schleife das Auslesen der Foren.
Sie besteht aus 1 x n Operationen zum Anlegen eines Arrays, 1 x m if-Abfragen und 1 x m Schreiboperationen
Du hast die verschachtelte Schleife die zur Ausgabe da ist.
Sie besteht aus m + n Ausgaben.
Das macht im PHP-Code ein Laufzeitverhalten von 3 n + 3 m
Bei dem Code mit einem SQL-Statement gibt es eine Schleife.
Sie besteht aus n Ausgaben und n Zuweisungen. Dazu kommen m if-Abfragen und m Ausgaben.
Das macht im PHP-Code ein Laufzeitverhalten von 2 n + 2 m.
Da MySQL mittlerweile Selects cachen kann (wenn es entsprechend konfiguriert ist), ist das Laufzeitverhalten auf diesen zwei relativ statischen Tabellen gering (die Ergebnismenge ist m Zeilen lang).
Die Ergebnismengen mit 2 SQL-Statements sind zusammen m + n Zeilen lang und es werden zwei Querys gestartet.
Die größte Unbekannte bleibt, wie Du sagst, das Übertragen der Daten und ist, denke ich, sehr von der Serverinfrastruktur abhängig (PHP und DB auf einem Rechner oder auf verschiedenen mit 100 MBit, 1 GBit oder gar online mit noch langsameren Verfahren angebunden).
Du hast recht. Auch wenn es in diesem konkreten Fall nicht wichtig ist, sollte man immer auf die Performanz achten (ich hoffe, das meintest Du in diesem Fall mit optimiert Programmieren). Ich würde mich freuen, wenn das noch mal jemand testen kann. Ich habe derzeit noch kein Webserver, PHP und MySQL auf meinem frisch installierten Rechner.
Entschuldige bitte im Vorwege, wenn ich mich jetzt etwas ungepflegt ausdrücke, aber eine redundanzfreie Tabelle als Ergebnis eines Querys erhalten zu wollen ist Blödsinn.
Dann müsste man JOIN aus der Syntax verbannen.
SQL dient doch dazu, eine normalisierte Datenbank, die nicht besonders leicht zu lesen ist, mit der Abfrage in eine einzige darstellbare Tabelle zu überführen.
Das dient doch auch dazu, unabhängig von der jeweiligen Programmiersprache bereits ein brauchbares Ergebnis zu erhalten, welches direkt aus der dafür optimierten (z.B. durch Indizes und Caches) Datenbank generiert wird.
Stell Dir mal eine Adressdatenbank vor, in der die Länder in einer eigenen Tabelle abgelegt sind. Willst Du diese nicht direkt über einen JOIN einbinden, sondern hinterher mit der Anwendungs-Programmiersprache heraussuchen, damit Du redundanzfreie Ergebnistabellen erhältst?
Die Normalisierung dient in erster Linie dem redundanzfreien Speichern, um Dateninkosistenzen zu vermeiden. Tabellen, die zum Zweck der Ausgabe erzeugt werden haben damit nichts zu tun.
Das Ergebnis der SQL-Abfrage ist eben keine Tabelle in der Datenbank. Es ist eine Tabelle aus der Datenbank. Diese Tabelle steht alleine als Auszug der Datenbank und gehört nicht zu einem normalisierten Datenbankschema.
Gruß hpvw
PS: Der Begriff Sortieren war blöd, aber mit Zuordnen meinte ich das:
PHP:
if(!isset($board[$forum['cat_id']])) { $board[$forum['cat_id']] = array(); }
$board[$forum['cat_id']][] = $forum;