Aufteilen von MySQL-Anfragen
Severin Kacianka
- programmiertechnik
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:
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
}
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
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.
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
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?
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
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";
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.
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