Severin Kacianka: Aufteilen von MySQL-Anfragen

Beitrag lesen

Hallo lieber Forum,

ich versuche mich gerade daran eine PHP-Webapplikation vollständig objektorientiert zu programmieren und stehe vor folgendem Problem:
Momentan habe ich für jede Tabelle aus der Datenbank auch eine Klasse die sich um den Zugriff auf diese Tabelle kümmert.

Beispiel:
Für die Tabelle Benutzer gibt es die Klasse Benutzer
Für die Kategorie Benutzer gibt es die Klasse Kategorie

Das ist soweit auch gut, nur was mache ich bei Joins?

Angenommen jeder Benutzer gehört zu einer Kategorie (hat also das Feld FK_KATEGORIE in der die ID der Kategorie steht). Jetzt sehe ich zwei Möglichkeiten Benutzer zu konstruieren:

  1. Benutzer hat eine Methode erzeugeAusDB die die 'normalen' Felder füllt und für Kategorie eine neue Anfrage absetzt
    Pseudocode:
  
function erzeugeAusDB(){  
  $sql='SELECT * FROM `benutzer` WHERE `BID`='.$this->bid;  
  $r = mysql_fetch_assoc(mysql_query($sql));  
  $this->setName($r['name']);  
  ....  
  $this->setKategorie($r['FK_KATEGORIE']);  
}  
function setKategorie($kid){  
  $this->Kategorie = new Kategorie;  
  $this->Kategorie->setId($kid);  
  $this->Kategorie->erzeugeAusDB(); //jetzt passiert eine zweite Anfrage  
}  

  1. Die Methode erzeugeAusDB besteht aus einem komplexen Join und manipuliert Kategorie direkt.
  
function erzeugeAusDB(){  
  $sql='SELECT * FROM `benutzer` b INNER JOIN (`kategorie` k)ON  
  (b.`FK_KID`=k.`KID`) WHERE `BID`='.$this->bid;  
  $r = mysql_fetch_assoc(mysql_query($sql));  
  $this->setName($r['name']);  
  ....  
  $this->kategorie= new Kategorie;  
  $this->kategorie->setId($r['KID']);  
 $this->kategorie->setName($r['KNAME']);  
}  
  

Die erste Version scheint mir die beiden Objekte sauberer von einander zu trennen, die zweite braucht nur eine Anfrage und scheint mir dadurch schneller.

Was meint ihr?

Danke für eure Zeit und liebe Grüße,
Severin

--
They that can give up essential liberty to obtain a little temporary safety deserve neither liberty nor safety.
-- Benjamin Franklin