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”
-
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).
Auf einen Blick
Archiv
- Oktober 2008
- August 2008
- Juli 2008
- Juni 2008
- Mai 2008
- April 2008
- März 2008
- Februar 2008
- Januar 2008
- Dezember 2007
- November 2007
- Oktober 2007
- September 2007
- August 2007
- Juli 2007
- Juni 2007
- Mai 2007
- April 2007
Kategorien
- Allgemein (72)
- Cake vs Rails (3)
- CakePHP (42)
- Meinung (16)
- Projekt (6)
- Rails (5)
- Tipps (27)
- Typo3 (4)
Letzte Einträge:
- 11.04.2007: Neustart
- 11.04.2007: Design Version 1 steht
- 11.04.2007: Blog