CakePHP & DIEVOLUTION Blog

Rekursive SQL Abfragen

 

Eigentlich ein Anfängertipp, aber hätte mir den jemand vor drei Monaten verraten, hätte ich mich sicherlich leichter getan, ein Forum mit CakePHP zu erstellen.

Problemstellung z.B.:

Ihr habt drei SQL Tabellen. Boards,Threads und Posts. Jedes Board hat dabei viele Threads, und viele Threads haben viele Posts.

Der Aufruf im Boards Controller sähe so aus:
$this->board->findall();
Dies bringt mir dieses Ergebnis:
Board1 { Thread1 Thread2 Thread3 } Board2{ Thread4 ... }
Nun möchte ich in der Boards Ansicht aber die Zahl aller Postings dieses Boards haben. Nun gibt es verschiedene Möglichkeiten.

1. Ich könnte den Posts noch die board_id mit auf den Weg geben, was aber nur zusätzlicher Balast wäre.
2. Ich könnte im Controller eine Schleife über alle Threads des Boards laufen lassen, was aber auch nur zusätzliche Zeit kostet.

Viel einfach ist es nun, folgendes zu schreiben:
$this->Board->recursive = 2; $this->Board->findall();
Nun werden automatisch alle Posts zu den Threads geholt. Diesen Tipp kann man für viele unterschiedliche Problemstellungen verwenden.

Achtung: Rekursionen können bei größeren Datensätzen zu Geschwindigkeitseinbußen führen.


Veröffentlicht am Sonntag, den 13. Mai 2007 um 17:33 Uhr veröffentlicht

Du kannst einen Kommentar schreiben, oder einen Trackback auf deiner Seite einrichten.

Eine Reaktion zu “Rekursive SQL Abfragen”

 

  1. rikman Am 20. Juni 2007 um 20:09 Uhr

    Solche Abfragen killen dir schon bei kleineren Tabellen die Kiste.

    Nehmen wir an, du hast 10 Boards mit je 10 Threads mit je 10 Posts.

    Fuer die Forenuebersicht wuerde erst mal eine Abfrage die Boards lesen, dann gaebe es 10 Abfragen fuer die Themen in den Boards und dann 100 Abfragen fuer die Posts in den Themen. 111 Queries fuer eine einzige Seite ist definitiv zu viel (zumindest fuer ein Forum). Dazu kommen ja dann auch noch weitere Requests fuer Userdaten etc.

    Fuer solche Zwecke ist es allgemein ratsam, sich von dem Gedanken der komplett normalisierten Datenbanken zu verabschieden und an bestimmten Stellen denormalisierte Daten zu speichern. Die Board-Tabelle koennte eine Spalte haben, die die Anzahl Themen des Boards speichert, die Thread-Tabelle koennte sich die Anzahl Posts des Threads merken. Mit dieser Denormalisierung werden aus den 111 Queries schon mal 11 - entspricht einem Faktor 10!

    Nachteil dieser Methode: Man muss sich darum kuemmern, dass die Counter aktuell bleiben. Mit CakePHP ist das kein Problem: einfach in die jeweiligen afterSave(), afterDelete() Callback die entsprechenden Felder updaten. (Kostet einen Schreibzugriff extra, ist aber fuer gewoehnlich 100 eingesparte Reads wert).

Einen Kommentar schreiben