Objektorientierung und Datenbanken
-
Sorry, falls der Titel nicht aussagekräftig genug sein sollte, aber mir ist nichts besseres eingefallen.
Primär dreht es sich bei mir um PHP und mySQL, aber ich denke, das ist eher ein allgemeineres Problem.
Es geht um folgendes:
Ich habe meinetwegen eine Tabelle in der Datenbank, in der Personen gespeichert werden.Bisher mache ich das so, dass ich mir quasi eine Controller-Klasse schreibe, die ca. so aussehen könnte:
class PersonenCtrl { function PersonenCtrl() { // initialisierungen, die evtl. nötig sind } function listPersonen($filter) { // Hier kommt ein entsprechendes SQL-Statement hin return $list; } function getPerson($id) { // SQL-Statement return $person; } function savePerson($daten) { // SQL-Statement zum speichern } // usw. }
Das Problem, was ich hierbei habe ist, dass "getPerson" mir z.B. ein assoziatives Array mit den entsprechenden Daten zurückliefert und es ab dem Zeitpunkt nicht mehr wirklich objektorientiert arbeitet. Jetzt frage ich mich, ob es nicht evtl. Sinn machen würde eine Klasse "Person" zu erstellen, die dann evtl. so aussehen könnte:
class Person { function Person($id) { $this->getDB($id); // evtl. noch was } function getDB($id) { // SQL-Statement, um den Datensatz zu holen und die Attribute zu initialisieren } function saveDB() { // Datensatz speichern } function initFromArray($daten) { // Klasse mit Daten des Arrays initialisieren } // usw. }
Naja, irgendwie so. Die Controller-Klasse würde ich dann zwar weiterhin brauchen, aber ich würde halt mit Objekten arbeiten können. Das hätte natürlich zur Folge, dass ich z.B. die Methode "listPersonen" folgendermaßen schreiben müsste:
... function listPersonen($filter) { // liste per SQL aus DB holen $list = array(); foreach (...) { $p = new Person(); $p->initFromArray($row); array_push($list, $p); } } ...
Mich würde interessieren, ob das obige überhaupt sinnvoll ist und wie ihr das macht. Evtl. gibt es ja auch zuviel Geschwindigkeitseinbußen, wenn ich bei einer Liste z.B. 1000 Objekte erstelle, wenn ich dies auch mit einem Array mit 1000 Elementen realisieren könnte. Habt ihr da schon Erfahrungen?
-
Dieser Thread wurde von Moderator/in rüdiger aus dem Forum Rund um die Programmierung in das Forum Datenbanken verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Hallo,
ich kenn mich zwar nicht in PHP so gut aus, aber ich hoffe ich kann dir trotzdem ein wenig behilflich sein.
Also für den Anfang sind deine Gedankengänge gar nicht mal so schlecht. Ähnliches hat man früher mit einen DAO (Data Access Object) Layer bewerkstelligt, bevor man mit den ganzen ORM (Object Relational Mapping) Tools überschüttet wurde (z.B. Hibernate).
Auf alle Fälle macht es Sinn deine Relationen in deinen Prog. als Objekte darzustellen, da es zu einen die Lesbarkeit und zum anderen die Erweiterbarkeit fördert. Ich denke auch das solche kleinen Datensätze keine großartigen Performance Probleme hervorrufen sollten. Der einzige Kritikpunkt meinerseits ist, dass die Personen zu stark an das relationale DB-Design gekoppelt ist. Solltest du in etwa Attribute, etc. im Schema ändern, müsstest du gleich an zwei Stellen im Prog.-code handanlegen.
Benutze einfach deine Controller Klasse zum erzeugen, einfügen, löschen, etc. von Personen.Beispiel: getPerson(int id) { //SQL Stmt Person p = new Person(rs.getString("surname"), rs.getString("forename")); p.setBirth(rs.getTimestamp("bith"); }
Ich weiss nicht in welcher Grössenordnung sich dein Projekt befindet, aber sollte es sehr komplex sein, würde ich dir empfehlen, dich mal mit Hibernate und einer ordentl. OOP Sprache (C++/Java) auseinander zu setzen. Dies hat den Vorteil, dass dir Arbeit wie das Handling von Transaktionen, Persistenz und Caching abgenommen wird und desweiteren ist deine Implementierung DB unabhängig.
Gruss
Marcel
-
Erstmal vielen Dank für die Antwort. Auf jeden Fall habe ich jetzt auch neue Begriffe, wonach ich suchen kann.
Mein Projekt ist eigentlich recht klein. Es soll nen CMS werden, mal schauen, ob's was wird.