ubuntuusers.de

[PHP/MYSQL] Daten sinnvoll speichern und verarbeiten

Status: Ungelöst | Ubuntu-Version: Ubuntu 12.04 (Precise Pangolin)
Antworten |

King_joe

Anmeldungsdatum:
10. September 2009

Beiträge: 19

Hallo Ubuntu Community,

Meine Frage bezieht sich auf das allgemeine und sinnvollste Vorgehen zum Auswerten und bearbeiten von überschaubar großen Datentabellen. Am besten ich verbildliche meine Frage an einem beispiel: Ich habe eine Tabelle mit einer Menge an Einträgen die zwischen 300 und 600 schwankt. In verschiedenen Fällen muss ich entweder einzelne Einträge, aber auch alle Einträge oder große teilmengen an Einträgen ändern.

Im allgemeinen möchte ich das problem objektorientiert lösen. Im speziellen habe ich bis jetzt folgende Möglichkeit angegangen: Ich habe eine Klasse die als Eigenschaft ein Array besitzt, welches im Konstruktur mit allen Daten aus der MySql Tabelle gefüllt wird. Es hat folgende Struktur:

array[ROWx] = array(column1=>WERTx1,column2=>WERTx2,columnn=>WERTxn)

Jetzt hat die Klasse verschiedene Methoden zum bearbeiten des Arrays und eine Methode zum speichern des Arrays in der Datenbank wobei alle alten Einträge überschrieben werden.

Zusammengefasst:

 <*> Alle Daten aus der Tabelle in einem Objekt->Array gespeichert
 <*> Bearbeitung des Arrays durch Objekt->Methoden
 <*> Array wieder in Datenbankstruktur übertragen und speichern

Ist dieses Vorgehen sinnvoll? In den Methoden alle Werte einzeln durch Mysql-Querys zu bearbeiten ist durch die doch recht große Menge an Werten nicht so sinnvoll,oder?

Falls es sinnvoll ist erst alle Daten auszulesen und in PHP zu bearbeiten:Gibt es bessere Möglichkeiten in PHP solche Datenbankinformationen zwischenzuspeichern?(Anstelle des Arrays oben)

Danke im Vorraus.

MfG

TheDarkRose

Avatar von TheDarkRose

Anmeldungsdatum:
28. Juli 2010

Beiträge: 3459

Schon mal eine dokumentenorientierte Datenbank wie MongoDB gedacht? Der MongoDB-Treiber für PHP stellt dir die Dokumente automatisch als natürliche Arrays dar.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13216

Es hängt von der Art der Manipulationen ab: wenn es darum geht, alle Datensätze gleichförmig zu ändern (z.B. "Preis + 10%"), dann kann das eine relationale DB sehr gut - und zwar ohne die Daten in den Client zu laden.

Ob eine dokumentenorientierte Datenbank hier besser wäre, vermag ich beim aktuellen Kenntnisstand nicht zu sagen.

Ciao

robert

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

King joe schrieb:

Im allgemeinen möchte ich das problem objektorientiert lösen.

Dann solltest Du imho die gängigen objektorientierten Prinzipien und ggf. dazu anerkannte Design Pattern nutzen.

Im speziellen habe ich bis jetzt folgende Möglichkeit angegangen: Ich habe eine Klasse die als Eigenschaft ein Array besitzt, welches im Konstruktur mit allen Daten aus der MySql Tabelle gefüllt wird. Es hat folgende Struktur:

array[ROWx] = array(column1=>WERTx1,column2=>WERTx2,columnn=>WERTxn)

Jetzt hat die Klasse verschiedene Methoden zum bearbeiten des Arrays und eine Methode zum speichern des Arrays in der Datenbank wobei alle alten Einträge überschrieben werden.

Zusammengefasst:

 <*> Alle Daten aus der Tabelle in einem Objekt->Array gespeichert
 <*> Bearbeitung des Arrays durch Objekt->Methoden
 <*> Array wieder in Datenbankstruktur übertragen und speichern

Ist dieses Vorgehen sinnvoll?

Auch wenn ich aus dem Beitrag nicht alles verstanden habe, so schwant mir dabei nichts gutes.

Du vermischst imho zu sehr die Domänenschicht mit der Datenzugriffsschicht. Dies ist per se suboptimal, da Du damit automatisch mehrere OO-Prinzipien verletzt und dies immer ein Indiz dafür ist, dass man einen schlechten Ansatz gewählt hat.

Was auch immer Du in der DB stehen hast, sind ja lediglich Daten. In einer Welt von Objekten denkst Du aber nicht in Daten, sondern eben in Objekten, die eine bestimmte Aufgabe haben und ein spezielles Konzept Deiner Problem-Domäne abbilden. *Wie* diese Objekte mit Inhalt gefüllt werden, gehört *nicht* in das Objekt selber hinein! In vielen Fällen stammen Attributwerte tatsächlich aus einer relationalen Datenbank, es können aber ebenso gut Werte aus Benutzereingaben, XML- oder JSON-Nachrichten von Webservices oder last but not least Testdaten für Unit- / Intergrationstests sein.

Ich würde annehmen, dass Dir noch nicht klar ist, wie Deine Domänenobjekte aussehen, wie sie interagieren und zusammen gehören. Wenn Du diese Objekte modellierst, denke stets daran, dass die *vollständig* unabhängig von irgend einer Datenzugriffstechnologie sein sollten!

Das Manipulieren von Attributen von solchen Objekten sollte *nur* auf Domänenebene geschehen!

Wenn Du ein Objektmodell der Domäne hast, dann kannst Du Dich an die Datenzugriffsschicht machen und sogenannte Data Access Objekte (DAOs) implementieren. Diese können sich dann darum kümmern, wie ein Objekt tatsächlich in die Datenbank reinkommt, rauskommt, in der DB verändert werden muss usw. Sprich das typische CRUD eben.

Merke: Die DAOs kennen die Domänen-Objekte, nicht aber anders herum!

In einem DAO könntest Du also eine Methode anbieten, die ein einzelnes Objekt in die DB schreibt. Dies kann simpel über insert passieren. Wenn Du das DAO "schlau" machst, kann es daürber hinaus selber entscheiden, ob das Objekt "neu" ist (→ insert) oder nur verändert ist (→ update). Dazu kannst Du eine Methode anbieten, die eine Sammlung (z.B. ein Array) von Domänen-Objekten in die DB schreibt... dafür kann das DAO dann ggf. einen Bulk-Insert Mechanismus nutzen, was bei großen Datenvolumen einen großen Zeitvorteil mit sich bringen kann. Wie Du siehst, kannst Du solche Optimierungen dann auf der unteren Ebene anbringen - Deinen Domänen-Objekten kann und sollte das vollkommen egal sein!

Ich könnte dazu noch zig Seiten an Sermon schreiben, aber ohne genauere Angaben oder Feedback von Dir, geht das dann vermutlich ins leere... 😉

Wichtig als Quintessenz ist das eine: Persistenzmechanismen aller Art gehören nicht zu einem Domänen-Objekt! (Selbiges gilt ebenso für andere Dinge wie GUI-Repräsentation, Benutzer-Eingaben und alle anderen "Cross Concern"-Aspekte) SRP ist das einfachste OO-Prinzip und sollte immer befolgt werden.

Du könntest Dir übrigens überlegen, eine Bibliothek zu nutzen, die dafür gemacht ist. Sogenannte "Objekt relationale Mapper" (ORM) sind genau das, was Du suchst. Die gibt es auch für PHP. Mit ein wenig Glück bieten die auch einen "SQL Abstraction Layer", der dynamische Queries ermöglicht, ohne sich SQL per Hand zusammen zu frickeln.

In den Methoden alle Werte einzeln durch Mysql-Querys zu bearbeiten ist durch die doch recht große Menge an Werten nicht so sinnvoll,oder?

Definitiv ja! Auf der Datenzugriffsseite kannst und solltest Du DB-Zugriffe optimieren; durchaus sogar speziell für das zugrunde liegende DBMS. Das schließt ein, dass man nicht bei jeder Änderung an einem Objekt-Attribut gleich ein update auf die DB los lässt.

Antworten |