Severin Kacianka: Aufteilen von MySQL-Anfragen

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
  1. Momentan habe ich für jede Tabelle aus der Datenbank auch eine Klasse die sich um den Zugriff auf diese Tabelle kümmert.

    Das ist schlecht.

    Die Datenbankstruktur hat mit der Klassenstruktur absolut nichts zu tun. Löse dich von diesem 1:1-Zusammenhang.

    1. Hallo,

      Die Datenbankstruktur hat mit der Klassenstruktur absolut nichts zu tun. Löse dich von diesem 1:1-Zusammenhang.

      Es ist aber schon so, dass (um mein kurzes Beispiel zu verwenden) Benutzer und   Kategorie unabhängige Dinge sind. Für den Benutzer ist es egal wie die Kategorie aussieht und funktioniert.

      Gruß und Danke,
      Severin

      --
      They that can give up essential liberty to obtain a little temporary safety deserve neither liberty nor safety.
      -- Benjamin Franklin
      1. Die Datenbankstruktur hat mit der Klassenstruktur absolut nichts zu tun. Löse dich von diesem 1:1-Zusammenhang.

        Es ist aber schon so, dass (um mein kurzes Beispiel zu verwenden) Benutzer und   Kategorie unabhängige Dinge sind. Für den Benutzer ist es egal wie die Kategorie aussieht und funktioniert.

        Also wird es keine JOINS dieser beiden Tabellen geben, und du hast kein Problem.

        Oder?

        1. Hallo,

          Also wird es keine JOINS dieser beiden Tabellen geben, und du hast kein Problem.

          Nein. Wenn ich zum Beispiel den Namen eines Benutzers ändere ist mir egal zu welcher Kategorie er dazu gehören. Wenn ich es aber wissen will muss ich joinen. Es ist nicht immer nötig, aber manchmal.

          Ich hab mir schon überlegt an vielgenutzen stellen einfach Joins zu verwenden und den Rest langsamerer und dafür leichter verständlich zu halten.

          Gruß,
          Severin

          --
          They that can give up essential liberty to obtain a little temporary safety deserve neither liberty nor safety.
          -- Benjamin Franklin
  2. echo $begrüßung;

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

    Wenn du es dir leisten kannst, mach es sauber. Wenn du Geschwindigkeit brauchst, wirst du sicher um Kompromisse nicht herumkommen.

    echo "$verabschiedung $name";

  3. 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?

    OO und RDBMSe scheinen sich irgendwie zu beissen. Du wirst einerseits an Objektgruppen, die mehrere Datentabellen zusammenfassen, nicht vorbeikommen, anderseits besteht die Gefahr, dass Du eine Traffic-Bombe programmierst.

    Kurzum, ich würde es nicht tun.

    1. Hallo,

      OO und RDBMSe scheinen sich irgendwie zu beissen.

      Das trifft es sehr gut! Ich versuche es zuerst einmal möglichst "sauber" zu programmieren und wenn es mir an Geschwindigkeit fehlt kann ich immer noch einzelene Teile "schmutzig" verbessern :-)

      Gruß,
      Severin

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