Objekte in Datenbank speichern und wieder herstellen...

Objekte in Datenbank speichern und wieder herstellen...

am 28.09.2004 12:40:28 von Nils Liebherr

Hallo NG!

Habe schon fleißig gegoogle'd, aber nichts passendes gefunden :-(
Ich versuche seit einiger Zeit, in PHP komplett objektorientiert zu
programmieren, und stoße immer wieder auf das gleiche (stilistische)
Problem:

Egal, wofür die Klasse nun genau ist, will/muss ich die entsprechenden
Objekte meistens in einer Datenbank speichern. Ist ja auch kein Problem,
für jede Klasse eine Realtion, für jede Eigenschaft ein Attribut.
Zumindest so in etwa...

Aber wie stelle ich es am schönsten an, die Objekte wieder aus der
Datenbank zu holen?
Baue ich mir für die Klasse einen Konstruktor, dem ich beim Instaziieren
eines Objektes entsprechnde Paramater (z.B. die ID) übergebe und der mir
dann die Daten aus der DB holt?
Oder hole ich erst die Daten, instaziiere das Objekt und weise dann die
Daten zu?
Habe auch schon mit dem Gedanke gespielt, das Objekt zu serialisieren
und dann als String in der DB zu speichern, halte ich aber für unschön.

Wie macht man sowas stilistisch am "schönsten"?
Wäre für ein paar grundlegende Tipps dankbar...

Vielen Dank und Grüße,
Nils

Re: Objekte in Datenbank speichern und wieder herstellen...

am 28.09.2004 13:42:07 von Tobias Kutzler

Nils Liebherr schrieb:
> Hallo NG!
>
> Habe schon fleißig gegoogle'd, aber nichts passendes gefunden :-(
> Ich versuche seit einiger Zeit, in PHP komplett objektorientiert zu
> programmieren, und stoße immer wieder auf das gleiche (stilistische)
> Problem:
>
> Egal, wofür die Klasse nun genau ist, will/muss ich die entsprechenden
> Objekte meistens in einer Datenbank speichern. Ist ja auch kein Problem,
> für jede Klasse eine Realtion, für jede Eigenschaft ein Attribut.
> Zumindest so in etwa...

Darüber haben sich schon ne Menge Leute den Kopf zerbrochen und sind zu
dem Ergebnis gekommen entweder eine Objektdatenbank bzw.
objektrelationale Datenbank zu nehmen oder ein Mapping von Objekten auf
das relationale Schema zu machen. Oracle bietet z.b. die Möglichkeit,
objektrelational Daten zu speichern. D.h., dass die Objekte in
Relationen gespeichert werden, in denen die Spalten den Eigenschaften
entsprechen.

Ich geb Dir mal nen Link zu der Vorlesung, die ich letztes Semester
besucht habe. Dort stehen ein paar Infos. Ansonsten kann ich leider
nicht mit mehr Infos dienen. Praktisch haben wir in einigen Seminaren
mal mit Oracle gearbeitet. Eine Applikation, die diese Daten genutzt
hat, ist dabei leider nicht herausgekommen.
Hier der Link:
http://wwwiti.cs.uni-magdeburg.de/iti_db/lehre/ordbs/index.h tml

Ein weiteres Problem ist, dass sich Objektdatenbanken trotz Ihres
Vorteils, dass man Objekte einfach so speichern kann, nicht durchgesetzt
haben. Einen wesentlichen Beitrag dazu hat XML geleistet. Dort hast Du
die Möglichkeit Objekte in XML Strukturen abzulegen... Aber ich schweife
vom Thema ab ;-)
>
> Habe auch schon mit dem Gedanke gespielt, das Objekt zu serialisieren
> und dann als String in der DB zu speichern, halte ich aber für unschön.

Du wirst wahrscheinlich nicht drumherum kommen...
>
> Wie macht man sowas stilistisch am "schönsten"?
> Wäre für ein paar grundlegende Tipps dankbar...
>
> Vielen Dank und Grüße,
> Nils

Ciao,
Tobias

Re: Objekte in Datenbank speichern und wieder herstellen...

am 08.10.2004 14:10:57 von Michael Tils

Nils Liebherr schrieb:
> Hallo NG!
>
> Habe schon fleißig gegoogle'd, aber nichts passendes gefunden :-(
> Ich versuche seit einiger Zeit, in PHP komplett objektorientiert zu
> programmieren, und stoße immer wieder auf das gleiche (stilistische)
> Problem:
>
> Egal, wofür die Klasse nun genau ist, will/muss ich die entsprechenden
> Objekte meistens in einer Datenbank speichern. Ist ja auch kein Problem,
> für jede Klasse eine Realtion, für jede Eigenschaft ein Attribut.
> Zumindest so in etwa...
>
> Aber wie stelle ich es am schönsten an, die Objekte wieder aus der
> Datenbank zu holen?
> Baue ich mir für die Klasse einen Konstruktor, dem ich beim Instaziieren
> eines Objektes entsprechnde Paramater (z.B. die ID) übergebe und der mir
> dann die Daten aus der DB holt?
> Oder hole ich erst die Daten, instaziiere das Objekt und weise dann die
> Daten zu?
> Habe auch schon mit dem Gedanke gespielt, das Objekt zu serialisieren
> und dann als String in der DB zu speichern, halte ich aber für unschön.
>
> Wie macht man sowas stilistisch am "schönsten"?
> Wäre für ein paar grundlegende Tipps dankbar...
>
> Vielen Dank und Grüße,
> Nils
Es ist nicht sonderlich elegant, Objekte in PHP so in die Datenbank
zuschreiben.
Objekte sollten (meiner Meinung nach) Entitäten darstellen.
Und da man eine DB nicht 100% nach Entitäten=Tabelle aufbaut und eine
Entität sich über mehrere Tabellen erstreckt, sollte man de DB komplett
von den Objekten in PHP abstrahieren.
Nehmen wir doch mal 3 Tabellen

1. Orte (id,name)
2. Adressen(id,ort_foreign_key,strasse)
3. Personen (id,name,adressen_foreign_key)

Auf den ersten Blick sieht das aus wie 3 verschiedene Objekte, das muss
es sind aber viel mehr.
Die Strasse kann z.b. auch eine Entität sein, sie hat (vielleicht)
mehrere Personen in sich wohnen und gehört zu einem Ort. Wenn Du
sicherstellst, daß die Strassen immer gleich geschrieben werden,
funktioniert das auch.
Es gibt bestimmt bessere Beispiele, mir viel nur gerade keines ein :-)

Wichtig ist auf jeden Fall, daß Du die Struktur der Datenbank von Deiner
übergeordneten Sprache trennst.
Sonst kannst Du nachher in der Sprache nicht einfach zb:
$db_klasse->hol('person',38) schreiben, sondern musst Dich beim
Programmieren immer damit beschäftigen, wie die Daten aussehen.
Und die Arbeit, die entsteht, wenn Du die DB änderst, kannst Du Dir
wahrscheinlich vorstellen....

Tut mir leid, Dir das so sagen zu müssen, aber Klassen in die DB zu
schreiben ist in 99% der Fälle falsch.

Wenn Du es aber trotzem musst, serialisiere sie.
Das macht aber dann wieder keinen Sinn, wenn Du nach einzelnen
Attributen suchen musst.
Und dann würde ich schon wieder ein normales PlainDB System bevorzugen.

Michael Tils

Re: Objekte in Datenbank speichern und wieder herstellen...

am 08.10.2004 14:36:56 von Mirza bin Zayed Al Awir

Nils Liebherr wrote:

> Habe schon fleißig gegoogle'd, aber nichts passendes gefunden :-(

http://www.deppenapostroph.de/

Mirza

Re: Objekte in Datenbank speichern und wieder herstellen...

am 08.10.2004 20:09:33 von Michael Tils

Mirza bin Zayed Al Awir schrieb:
> Nils Liebherr wrote:
>
>> Habe schon fleißig gegoogle'd, aber nichts passendes gefunden :-(
>
>
> http://www.deppenapostroph.de/
>
> Mirza

Sehr konstruktiver Beitrag, aller Achtung.

Re: Objekte in Datenbank speichern und wieder herstellen...

am 10.10.2004 09:36:41 von kscheller

Nils Liebherr wrote:

> Egal, wofür die Klasse nun genau ist, will/muss ich die entsprechenden
> Objekte meistens in einer Datenbank speichern.

Generell ist es besser, nicht die Objekte selbst, sondern die DATEN in
die Datenbank zu schreiben. So bleibt das Ganze einigermaßen
menschenlesbar.

In so fern ist Deine Gefühl, Objekte nicht serialisieren zu wollen,
schon richtig. :)

Du bastelst dann für jedes Objekt eine Art save() und restore() Methode,
die dann jeweils die Daten holt oder speichert. Im Prinzip also eine
Konvertierung. Das klappt wunderbar, so lange Du in einem Objekt nicht
andere Objekte referenzierst, sagen wir bei einer Baumstruktur.

Genau vor diesem Problem stand ich. Ich speichere einfach in meinen
Objekten die Indizies der Datenbank mit ab. Und fertig.

Servus,
Konni