PHP PHP & Mysql. Objekte ganz laden oder nur was gebraucht wird?

mercsen

Lt. Commander
Registriert
Apr. 2010
Beiträge
1.680
Einen schönen guten morgen liebe CB Gemeinde :)

Ich frage mich seit längerem was die performantere Lösung eines Problems ist das ich habe.

In meinem Programm werden, wie so oft in PHP anwendungen, alle Daten in einer Datenbank gespeichert. Bei dem Programm handelt es sich um ein Tool um Mitarbeiter auf einem Kalender verschiedenen Projekten zuzuordnen. Da ich eigentlich ein Java entwickler bin habe ich versucht es so Objektorientiert wie möglich aufzubauen. Also habe ich als erstes einige Klassen angelegt, z.b. Projekt und Mitarbeiter etc.

Meine eigentliche frage ist nun folgende:
Wenn ich ein Objekt instanziere, z.b. ein Projekt, habe ich es bisher immer so gemacht das direkt alle Daten zum Projekt aus der DB geladen und in dem Objekt gespeichert werden. Nun ist es aber oftmals so das ich gar nicht alle Daten brauche. Ist es dementsprechend sinnvoller, das wann immer ich etwas von dem Objekt über eine "get" Methode erfrage, die Daten erst dann aus der DB zu laden? Sprich nur das eine Feld?
Ich mache mir da sorgen um die performance und weiß nicht was für die DB besser ist. Kann mir da jemand weiter helfen, am besten wäre es mit einer kurzen Erklärung für eure Ansicht.
In Java wäre das kein Problem da ich das Objekt einfach im Speicher lassen würde und wenn jemand anderes Änderungen vornimmt lasse ich mir das mitteilen, das ist in PHP allerdings nicht so einfach zu realisieren. Dachte daran die Objekte in der Session zu speichern und regelmäßig per JS auf Änderungen zu prüfen, das erscheint mir aber noch als die schlechteste Lösung.

Vielen Dank im Voraus :)
 
Es liegt unter anderem an der Architektur der Server - sind Datenbank-Server und Webserver auf der kleinen Kiste, hast du schon einmal keinen Overhead durch das Netzwerk. Jedoch ist jeder Verbindungsaufbau zur Datenbank und jede Abfrage ein Performanceverlust. Ich würde alle Daten für das Objekt laden - schließlich willst du doch nicht jedes Attributs des Objekts bei Bedarf neuladen wollen oder? Die Frage ist wieviel Objekte es sein werden und wieviel Speicher ein Objekt in etwa verbraucht, um dann sinnvolle Aussagen drüber treffen zu können.
 
Hui, ja das ist schwer.
Ein Projekt Objekt hat nicht viele Felder (13), davon sind die meisten einfach nur Zahlen. Ein Mitarbeiter stellt aber gleich 68 Felder zur verfügung, die mit unter viel Text enthalten können.
Hauptsächlich geht es mir auch um das massive Mitarbeiter Objekt, denn um einen Mitarbeiter einem Projekt zuzuordnen ist es reichlich uninteressant wie seine Sv Nummer ist oder wann er geboren wurde.
Vlt. ist es da am besten eine zweite Klasse zu schreiben die nur für das Planen relevante Daten aus der DB holt. Oder ein State Pattern......
Die Anzahl an Objekten ist pro Script aufruf moderat, da i.d.r. nur ein Mitarbeiter Objekt und ein Projekt Objekt benötigt wird (außer für die suche und die gesamt Übersicht, aber da wird immer ein und das selbe Objekt überschrieben nachdem es ausgegeben wurde).

und zum Thema speicherverbrauch in PHP habe ich mal folgendes gefunden....
http://xtainment.net/wiki/index.php/PHPMemoryUsage
 
Ich würde das MA-Objekt so belassen. Jedoch würde ich zwei Methoden schreiben um das Objekt zu befüllen. Einmal würde ich eine Methode schreiben die das Objekt mit allen Daten befüllt und die andere Methode befüllt das Objekt nur mit den wichtigen Daten für die Projekt-MA-Beziehung und Darstellung. Am besten setzt du noch ein boolean im Objekt, damit du weist, von welcher Methode es geladen wurde. Somit kannst du auch ein "Light"-Objekt bei bedarf noch voll nachladen.
 
Wie gesagt, mir schwebt da ein State Pattern vor, ist ja im Prinzip das was du beschrieben hast.

Aber wenn ich das jetzt richtig verstehe sind MySql anweisungen wohl der einzige Performance bremser, also lade ich einfach immer alles, da SQL Server und Apache auf dem selben sys laufen kommt es immerhin nicht zu langen wartezeiten auf die Antwort des Servers....
 
Wie gesagt wenn du dann mehrere 10'000 Objekte hast, dann kann es auch auf den Speicher schlagen. Aber wenn du mit ein paar 100 Objekten arbeitest, spielt es keine Rolle, ob du alles lädst oder nicht.

Wenn natürlich ein MA-Objekt wiederum 100 andere Objekte enthält und diese wiederum ein paar weitere Objekte werden es dann doch sehr schnell, sehr viele.

Aber wenn das MA-Objekt einfach ein paar Strings, und ints aus ein paar DB-Tabellen hat, sollte das kein Problem sein.
 
Wenn alle Daten in der selben Tabelle liegen, dann würde ich sie einfach alle laden. Das sollte die Performance nicht allzusehr stressen. Solltest du dann feststellen, daß es das doch tut (im Zweifelsfall mal die Queries benchmarken / EXPLAINen lassen), kannst du dir immer noch was überlegen.

Anders kann es aussehen, wenn die Objekte, die du lädtst, auf weitere Objekte in anderen Tabellen verweisen, so daß du JOINs einsetzen müßtest, um alle Daten auf einmal zu bekommen. Dann ist es oft sinnvoll, mit "Lazy loading" zu arbeiten, d.h. die weiteren Objekte erst dann zu laden, wenn sie tatsächlich gebraucht werden.
 
eben aus diesem Grund habe ich alle in einer Table, hatte überlegt Adresse daten, Kontaktdaten etc. auszugliedern. Aber die DB ist auch so in einer normalform, redudanz gibt es keine. Ok ich lass alles beim alten, war mir halt nicht sicher was nun mehr performance frisst, alles oder partielles laden. Danke :)
 
Zurück
Oben