Entwickler-Ecke
Off Topic - Synchronisation PHP-Objekte mit Backend
Marco D. - Di 15.02.11 11:18
Titel: Synchronisation PHP-Objekte mit Backend
Guten Morgen,
für eine Studienarbeit entwickle ich eine recht umfangreiche PHP-Internetsoftware.
Ich habe eine Vielzahl an PHP-Klassen und entsprechende Datenbanktabellen, welche die Laufzeitdaten der einzelnen Objekte enthalten. Bezüglich des Zusammenspiels zwischen einem PHP-Objekt und der Datenbank lassen sich grundsätzlich zwei Ansätze unterscheiden.
Greift man per getter- oder setter-Methode auf ein PHP-Objekt zu, können die entsprechenden Daten einerseits aus dem Objekt zurückgegeben werden (dann als Felder abgelegt) oder andererseits direkt aus der Datenbank gelesen und zurückgegeben werden.
Bei letzerer Variante spart man sich die Synchronisation zwischen den Objektinstanzen und der Datenbank. Wobei dann allerdings die Anzahl der Datenbankzugriffe enorm ansteigt, was sich wiederum in schlechter Performance bemerkbar machen kann.
Normalerweise würde man mit erster Variante arbeiten.
Das Problem auf das ich bei dieser Variante stoße, besteht in der Synchronisation einer Objektreferenz mit einer Kardinalität größer 1. Sobald in der DB Objekt A auf mehrere Objekte der Klasse B verweist und zur Laufzeit ein Objekt B aus dieser Referenz entfernt wird ($a->removeB($objectB)), muss diese Änderung mit der Datenbank synchronisiert werden. Wie mache ich das?
Zunächst könnte ich beim Persistieren des Objektes A alle Referenzen zu B innerhalb der DB löschen und alle Referenzen aus dem Arbeitsspeicher neu in die DB schreiben. Das halte ich aber für eine sehr unschöne Lösung.
Andererseits könnte ich mir beim Löschen der Referenz im Arbeitsspeicher merken, welches Objekt B betroffen ist und beim Persistieren die entsprechenden Referenzen in der DB entfernen. Diese Lösung wäre besser als die vorige, macht mich aber auch nicht vollkommen glücklich.
Welche Lösungsansätze seht ihr noch?
Viele Grüße aus Karlsruhe
Marco
iKilledKenny - Di 15.02.11 11:53
Hallo Marco,
ich arbeite in solchen Fällen mit Listenklassen, nicht mit mehreren Referenzen. Die Listenklasse merkt sich dann beim Löschen eines Objekts den Identifier und löscht dann beim SaveToDatabase den Record mit dem gemerkten Identifier aus der Datenbank. Vor dem Speichern in die Datenbank frage ich ab, ob ein Objekt modified ist. Bei einer Liste ist das z.B. dann der Fall, wenn ein Identifier als gelöscht vermerkt ist, bei einer Datenklasse dann, wenn sich zum Zustand nach dem Laden aus der Datenbank etwas verändert hat. Damit minimierst du die Zugriffe auf die Datenbank auf das nötigste, hast aber einen erhöhten Speicherbedarf, um die "originalen" Zustände festzuhalten.
Viele Grüße
Alex
Marco D. - Di 15.02.11 13:54
Hallo Alex,
ich verwende eine Collections-Klasse, die intern mit einem assoziativen Array arbeitet und Listenoperationen über Methoden bereitstellt.
Wahrscheinlich wird es am Ende darauf hinauslaufen, dass man sich von gelöschten Objekten den Identifier merken muss.
Rufst du die SaveToDatabase-Methode bei allen Objektzugriffen auf oder immer nur einmal am Ende der Abarbeitung?
Viele Grüße
Marco
iKilledKenny - Di 15.02.11 16:04
Normalerweise nur einmal am Ende, das hängt aber von der jeweiligen Anforderung/Situation ab.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!