php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger

PHP Einsteiger PHP Problemlösungen für Spracheinsteiger
Archive: 2004, 2004/2, 2005, 2005/2, 2006, 2007, 2008, 2009, 2010,

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 19.12.2011, 10:21  
Neuer Benutzer
 
Registriert seit: 23.11.2008
Beiträge: 27
PHP-Kenntnisse:
Anfänger
magpie befindet sich auf einem aufstrebenden Ast
Standard [Erledigt] Data-Mapper und mehrere Tabellen

Hallo

Ich steh im Moment etwas auf dem Schlauch im Bezug auf den Klassenaufbau für den Datenbankzugriff.

Ich habe mehrere Tabellen, welche unereinander verknüpft sind. Ungefähr so:
Code:
Person
-----
ID, name, vorname, geburtsdatum

Adresse
-------
ID, person (ID), plz, ort (ID)

Ort
---
ID, ort, land
Für den Datenzugriff verwende ich das Data-Mapper Pattern. Ich habe also für jede Tabelle eine Getter/Setter-Klasse und eine Mapper-Klasse. Dies ist für mich ok wenn ich jede Tabelle einzeln ansprechen will. Also eine neue Peron oder einen neuen Ort hinzufügen oder ändern möchte.
Wenn ich jetzt aber eine Person löschen möchte, muss ich erst in den Adressen nachschauen ob die Person eine Adresse hat. Wenn ja, muss diese auch gelöscht werden. In diesem Fall muss ich die einzelnen Schritte (prüfen, entscheiden, löschen) jedesmal manuell im Code schreiben. Um das zu vereinfachen würde ich da eine zusätzliche Klasse erstellen welcher ich alle Daten übergebe und die dann die Überprüfung und die weiteren Aktionen vornimmt.

Im Falle des obigen Beispieles funktioniert das recht einfach da es nur drei Tabellen sind. Wie sieht es aber aus wenn es, sagen wir 15 Tabellen sind? Da erstelle ich 15 Getter/Setter-Klassen, 15 Mapper-Klassen und X Spezialklassen. Je koplexer die Verknüpfungen unter den Tabellen je koplizierter der Klassenaufbau der Spezialklassen. Somit bekomme ich eine riesen Anzahl von Klassen.

Nun meine Frage. Stimmen meine Überlegungen oder bin ich da auf dem Holzweg da es für solche Fälle andere Pattern oder Lösungen gibt?


Gruss
magpie
magpie ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 19.12.2011, 10:47  
fab
Erfahrener Benutzer
 
Benutzerbild von fab
 
Registriert seit: 28.07.2010
Beiträge: 2.308
PHP-Kenntnisse:
Fortgeschritten
fab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblick
Standard

Zitat:
Zitat von magpie Beitrag anzeigen
Getter/Setter-Klasse
Hier liegt dein Problem: Du missverstehst das Model als reines Datenhaltungs-Objekt. Es kann durchaus Methoden haben, die komplexere Abfragen und Änderungen vornehmen, nur operieren sie eben nicht direkt auf der Datenbank. Das Übertragen dieser Änderungen zur Datenbank übernehmen dann wiederum die Mapper.

Zitat:
Wenn ich jetzt aber eine Person löschen möchte, muss ich erst in den Adressen nachschauen ob die Person eine Adresse hat. Wenn ja, muss diese auch gelöscht werden. In diesem Fall muss ich die einzelnen Schritte (prüfen, entscheiden, löschen) jedesmal manuell im Code schreiben. Um das zu vereinfachen würde ich da eine zusätzliche Klasse erstellen welcher ich alle Daten übergebe und die dann die Überprüfung und die weiteren Aktionen vornimmt.
Das könnte so aussehen (vereinfachtes Beispiel):

PHP-Code:
$person $personMapper->load($id);
$person->delete();
$personMapper->save($person);

// Person:
public function delete() {
  
$this->setDeleted(true);
  foreach (
$this->getAddresses() as $address) {
    
$address->delete();
  }

Ich lasse an dieser Stelle mal offen, wann du die Adressen lädst, dazu gibt es keine allgemeingültige Antwort. In diesem Beispiel könnte man den ganzen Prozess allerdings auch vom Mapper erledigen lassen, es ist ja nichts weiter als ein zusätzliches DELETE:

PHP-Code:
$personMapper->delete($id);

// PersonMapper:
public function delete($id) {
  
$this->query("DELETE FROM person WHERE id=$id");
  
$this->query("DELETE FROM person_address WHERE person_id=$id");

Oder man geht noch einen Schritt weiter und lagert es ganz in die Datenbank aus (z.B. mit InnoDB Tabellen: Foreign Key mit ON DELETE CASCADE)


Du siehst, es gibt je nachdem was genau zu tun ist, verschiedene Möglichkeiten, zusätzliche oder komplexere Aktionen unterzubringen, ohne für alles eine eigene Klasse zu erstellen.
fab ist offline   Mit Zitat antworten
Alt 19.12.2011, 11:49  
Neuer Benutzer
 
Registriert seit: 23.11.2008
Beiträge: 27
PHP-Kenntnisse:
Anfänger
magpie befindet sich auf einem aufstrebenden Ast
Standard

Danke für deine rasche Antwort, nun ist mir einiges klarer. Ich habe die Getter/Setter-Klassen bis jetzt wirklich immer als reines Datenhaltungsobjekt gesehen. Im oben genannten Beispiel geht es um Abhängigkeiten. Da ist es mir nun klar wie ich das lösen kann.

Wie sieht es aber aus, wenn ich z.B. ein Formular habe wo ich alle Daten eingebe und diese speichern möchte? Also Angaben zu Person und Adresse. Es geht mir um zwei Situationen:

Neu Einfügen
So wie du es beschrieben hast, würde ich da auch von der Person aus gehen und beim Einfügen überprüfen, ob auch eine Adresse eingefügt werden muss. Das ist in dem Fall vertretbar, kann aber meiner Meinung nach bei grösseren Tabellenmengen nicht immer funktionieren.

Daten Aktualisieren
In dem Fall möchte ich nur diejenigen Tabellen aktualisieren, bei welchen Daten geändert wurden. Auch in diesem Fall könnte ich wieder von der Person aus gehen und die Prüfung da machen. Ich denke aber, dass es auch hier nicht optimal ist.

Meine Bedenken kommen daher, dass ich ,so wie oben beschrieben, immer von einer bestimmten Tabelle aus arbeiten muss. Je nach Datenbankaufbau kann ich aber Daten einer bestimmten Tabelle von mehreren Richtungen her ansprechen.

Code:
Person
------
ID, vorname, nachname

Firma
-----
ID, firmenname

Adresse
-------
ID, strasse, ort

AdresseZuFirma
---------------
ID, firma (ID), adresse (ID)

AdresseZuPerson
---------------
ID, person (ID), adresse (ID)
In diesem Fall mmüsste ich alles doppelt haben. Einmal Für die Person und einmal für die Firma.

Muss ich das so lösen oder gibt es du dieser Situation auch eine andere, einfachere, Möglichkeit?
magpie ist offline   Mit Zitat antworten
Alt 20.12.2011, 07:02  
fab
Erfahrener Benutzer
 
Benutzerbild von fab
 
Registriert seit: 28.07.2010
Beiträge: 2.308
PHP-Kenntnisse:
Fortgeschritten
fab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblick
Standard

Zitat:
Zitat von magpie Beitrag anzeigen
Neu Einfügen
So wie du es beschrieben hast, würde ich da auch von der Person aus gehen und beim Einfügen überprüfen, ob auch eine Adresse eingefügt werden muss. Das ist in dem Fall vertretbar, kann aber meiner Meinung nach bei grösseren Tabellenmengen nicht immer funktionieren.
Ich würde ja sagen, Person einfügen und Adresse einfügen sind zwei getrennte Aktionen, auch wenn sie durch ein einzelnes Formular zustandekommen.

Zitat:
Zitat von magpie Beitrag anzeigen
Daten Aktualisieren
In dem Fall möchte ich nur diejenigen Tabellen aktualisieren, bei welchen Daten geändert wurden. Auch in diesem Fall könnte ich wieder von der Person aus gehen und die Prüfung da machen. Ich denke aber, dass es auch hier nicht optimal ist.
Dito hier.

Damit lösen sich dann auch deine Bedenken auf, jedes Objekt weiß über sich selbst, ob es geänderte Daten hat (bspw. durch einen isChanged-Flag, der von den Settern gesetzt wird) und der jeweilige Mapper prüft dann beim Aufruf von update($obj) ob die Daten zu $obj in der DB aktualisiert werden müssen.
fab ist offline   Mit Zitat antworten
Alt 20.12.2011, 15:05  
Neuer Benutzer
 
Registriert seit: 23.11.2008
Beiträge: 27
PHP-Kenntnisse:
Anfänger
magpie befindet sich auf einem aufstrebenden Ast
Standard

Ok, ich denke ich habe es verstanden.

Danke für deine Hilfe
magpie ist offline   Mit Zitat antworten
Alt 20.12.2011, 17:53  
Erfahrener Benutzer
 
Registriert seit: 25.05.2010
Beiträge: 852
PHP-Kenntnisse:
Anfänger
Trainmaster wird schon bald berühmt werden
Standard

Zitat:
Zitat von fab Beitrag anzeigen
jedes Objekt weiß über sich selbst, ob es geänderte Daten hat (bspw. durch einen isChanged-Flag, der von den Settern gesetzt wird)
Sprichst du von einem Flag für das ganze Objekt oder von Setter spezifischen Flags? Ersteres ist einfacher zu implementieren, Letzteres updated nur diejenigen Felder, die tatsächlich eine Änderung erfahren haben.
Trainmaster ist offline   Mit Zitat antworten
Alt 20.12.2011, 19:51  
fab
Erfahrener Benutzer
 
Benutzerbild von fab
 
Registriert seit: 28.07.2010
Beiträge: 2.308
PHP-Kenntnisse:
Fortgeschritten
fab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblick
Standard

Beides möglich, ich meinte einen Flag für das Objekt aber genausogut kann man die ursprünglichen Daten (soweit bekannt) vorhalten und vor dem Speichern prüfen, wo Differenzen vorliegen.
fab ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] Suche zwischen 2 Tabellen larabad PHP Einsteiger 11 30.03.2011 11:59
Daten aus 2 Tabellen ausgeben und sortieren moprhoyz Datenbanken 1 06.03.2011 22:29
[Erledigt] 2 Tabellen abgleichen und Inhalte übernehmen... Abweichler PHP Tipps 2010 3 29.07.2010 20:23
leere Tabellen löschen TobiasH Datenbanken 12 14.06.2010 16:08
Tabellen mittels Formular erzeugen Basti2o1o PHP Tipps 2010 13 05.05.2010 15:05
Mehrer Tabellen aus Datenbank auslesen? Blade JavaScript, Ajax und mehr 5 17.11.2009 16:08
gelöst: Datenbankabfrage über 3 Tabellen lord_icon Datenbanken 0 12.10.2009 00:38
[Erledigt] Mehrere MySQL Tabellen mit PHP abfragen DonMuchacho Datenbanken 7 27.07.2009 19:47
Tabellen miteinander verknüpfen Suzi Datenbanken 12 27.05.2009 11:40
[Erledigt] Limit auf Ergebnissumme mehrerer Tabellen Frank Datenbanken 8 02.09.2008 11:33
Tabellen für Vokabeltrainer anlegen... anonym01 PHP Tipps 2008 9 03.03.2008 21:18
Join-Abfrage über mehrere Tabellen sinai Datenbanken 3 04.02.2006 13:05
[Erledigt] Selectanfrage an eine Datenbank,aber aus mehreren Tabellen Datenbanken 2 26.10.2004 07:23
[Erledigt] fulltext suche priorität von tabellen setzen Datenbanken 1 09.08.2004 15:26

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php data mapper, php datamapper, mapper klassen

Alle Zeitangaben in WEZ +2. Es ist jetzt 19:31 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum