serialize() in Textfeld als Universalspeicher?
serialize() in Textfeld als Universalspeicher?
am 14.09.2006 21:51:54 von Jens Himmelrath
Hallo,
ich komme regelmäßig an Stellen wo ich mehrere Werte in einer Datenbank
speichern muss - entweder ich erstelle dafür eine eigene Tabelle mit den
jeweiligen Feldern passend zum Typ des zu speichernden Wertes, oder ich
packe alles in ein Array, sage serialize() und packe es in eine Text-Spalte.
Letzteres habe ich bisher immer äußerst ungern gemacht und z.B. in
Fällen wo ich definitiv nur einen Satz der Daten speichern würde und
z.B. eine Konfigurationstabelle nicht um X Spalten für eine
Funktionalität ergänzen wollte.
Ich weiß ehrlich gesagt nicht warum ich immer versucht habe ein
serialize() zu umgehen, aber ich hatte wohl immer das instinktive
Gefühl, dass es nicht so effizient/performant sein kann.
Nun meine Frage: Wenn ich immer nur auf alle gespeicherten Werte
gleichzeitig zugreifen will und auch definitiv niemals in Ihnen suchen
muss - stoße ich dann mit dieser Taktik überhaupt irgendwo an
Performance-Probleme bzw. gibt es Nachteile die ich im Moment noch gar
nicht sehe?
Best regards,
Jens Himmelrath
PS: Ich bin mir nicht ganz sicher ob ich nicht zumindest teilweise OT
bin, da zumindest die Nachteile die sich aus der grundsätzlichen
Speichertaktik ergeben ja nicht PHP-spezifisch sind.
Re: serialize() in Textfeld als Universalspeicher?
am 14.09.2006 23:20:48 von Niels Braczek
Jens Himmelrath schrieb:
> Nun meine Frage: Wenn ich immer nur auf alle gespeicherten Werte=20
> gleichzeitig zugreifen will und auch definitiv niemals in Ihnen suchen =
> muss - stoße ich dann mit dieser Taktik überhaupt irgendwo an=20
> Performance-Probleme bzw. gibt es Nachteile die ich im Moment noch gar =
> nicht sehe?
Ich benutze diese Technik, um Vorgabewerte (deren Struktur nicht von
vornherein bekannt ist) für dynamisch definierbare Formulare zu
speichern. Diese werden ebenfalls niemals durchsucht und werden immer am
Stück benötigt. Diese Voraussetzung scheint bei dir ja auch gegeben z=
u
sein. Ich halte dieses Design dann prinzipiell für tauglich.
Der Vorteil liegt darin, dass bei der Definition neuer (Verbund-)Felder
nichts am Datenbank-Layout gemacht werden muss.
Natürlich hat das negative Auswirkungen auf die Performanz, weil die
Daten immer wieder ausgepackt werden müssen. Allerdings halten diese
sich nach bisherigen Erfahrung *sehr* in Grenzen. Ich konnte zudem
Probleme feststellen, dass der serialisierte String nicht mehr
unserialisiert werden konnte, nachdem er aus der Datenbank kam (damit
kämpfe ich gerade).
MfG
Niels
--=20
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------
Re: serialize() in Textfeld als Universalspeicher?
am 14.09.2006 23:25:52 von Matthias Esken
On Thu, 14 Sep 2006 21:51:54 +0200, Jens Himmelrath wrote:
> ich komme regelmäßig an Stellen wo ich mehrere Werte in einer Datenbank
> speichern muss - entweder ich erstelle dafür eine eigene Tabelle mit den
> jeweiligen Feldern passend zum Typ des zu speichernden Wertes, oder ich
> packe alles in ein Array, sage serialize() und packe es in eine Text-Spalte.
>
> [...]
>
> Nun meine Frage: Wenn ich immer nur auf alle gespeicherten Werte
> gleichzeitig zugreifen will und auch definitiv niemals in Ihnen suchen
> muss - stoße ich dann mit dieser Taktik überhaupt irgendwo an
> Performance-Probleme bzw. gibt es Nachteile die ich im Moment noch gar
> nicht sehe?
IMHO nicht. Das verwende ich bei einem System von mir seit Jahren und habe
damit niemals Probleme gehabt.
Das einzige Problem könntest du bekommen, wenn du mal von PHP auf eine
andere Sprache willst. Dann brauchst du nämlich Funktionen, die serialize()
und sein Gegenstück ersetzen.
Gruß,
Matthias
Re: serialize() in Textfeld als Universalspeicher?
am 15.09.2006 00:00:00 von Claus Reibenstein
Niels Braczek schrieb:
> Ich konnte zudem Probleme feststellen, dass der serialisierte String
> nicht mehr unserialisiert werden konnte, nachdem er aus der Datenbank
> kam (damit kämpfe ich gerade).
Wie speicherst Du sie denn in der Datenbank?
Serialisierte Werte sollte man immer binär speichern. Jede andere Form
der Speicherung bedeutet eine Konvertierung, die die Werte unbrauchbar
machen kann.
Gruß. Claus
Re: serialize() in Textfeld als Universalspeicher?
am 15.09.2006 01:32:39 von Niels Braczek
Claus Reibenstein schrieb:
> Niels Braczek schrieb:
>=20
>> Ich konnte zudem Probleme feststellen, dass der serialisierte String
>> nicht mehr unserialisiert werden konnte, nachdem er aus der Datenbank
>> kam (damit kämpfe ich gerade).
>=20
> Wie speicherst Du sie denn in der Datenbank?
>=20
> Serialisierte Werte sollte man immer binär speichern. Jede andere For=
m
> der Speicherung bedeutet eine Konvertierung, die die Werte unbrauchbar
> machen kann.
Danke für den Tipp! Das Feld war TEXT, habe ich in BLOB geändert. Lei=
der
hat das nichts genützt. Inzwischen habe ich aber die Lösung gefunden:=
Das Problem waren die automagischen Slashes.
MfG
Niels
--=20
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------
Re: serialize() in Textfeld als Universalspeicher?
am 15.09.2006 02:26:27 von Hadanite Marasek
Jens Himmelrath wrote:
> Hallo,
>
> ich komme regelmäßig an Stellen wo ich mehrere Werte in einer Datenbank
> speichern muss - entweder ich erstelle dafür eine eigene Tabelle mit den
> jeweiligen Feldern passend zum Typ des zu speichernden Wertes, oder ich
> packe alles in ein Array, sage serialize() und packe es in eine
> Text-Spalte.
Vielleicht könntest Du den Anwendungsfall spezifischer erläutern?
Relationale Datenbanken sind nicht umsonst relational, ich sehe wenig
Sinn dahinter, das Prinzip zu unterlaufen, in dem man einen Array
serialisiert und für die Datenbank unereichbar in einem Textfeld
abspeichert - mit unereichbar meine ich, dass all die schönen
Datenbankfunktionen wie sortieren, suchen, eingrenzen, zählen,
aufsummieren... für die Katz sind.
Gruss H. Marasek
Re: serialize() in Textfeld als Universalspeicher?
am 15.09.2006 08:25:42 von Claus Reibenstein
Niels Braczek schrieb:
> Claus Reibenstein schrieb:
>
>> Serialisierte Werte sollte man immer binär speichern. [...]
>
> Danke für den Tipp! Das Feld war TEXT, habe ich in BLOB geändert. Leider
> hat das nichts genützt. Inzwischen habe ich aber die Lösung gefunden:
> Das Problem waren die automagischen Slashes.
Andere Frage: In welcher Form hast Du die serialisierten Werte (ich sage
jetzt bewusst nicht "String") an die Datenbank übermittelt? Als
Textstring (aua!) oder als hexadezimale Ziffern? Letzteres sollte
eigentlich in jedem Fall funktionieren.
Wenn Du die Werte als ASCII in der Datenbank haben möchtest, gäbe es
noch die Möglichkeit, sie base64 zu codieren.
Gruß. Claus
Re: serialize() in Textfeld als Universalspeicher?
am 15.09.2006 11:54:49 von Stefan Scholl
Jens Himmelrath wrote:
> ich komme regelmäßig an Stellen wo ich mehrere Werte in einer Datenbank
> speichern muss - entweder ich erstelle dafür eine eigene Tabelle mit den
> jeweiligen Feldern passend zum Typ des zu speichernden Wertes, oder ich
> packe alles in ein Array, sage serialize() und packe es in eine Text-Spalte.
Ja, hatte schon viel Spaß beim Debuggen solcher Konstrukte.
Re: serialize() in Textfeld als Universalspeicher?
am 15.09.2006 12:00:17 von Jens Himmelrath
Hadanite Marasek schrieb:
> Jens Himmelrath wrote:
>> Hallo,
>>
>> ich komme regelmäßig an Stellen wo ich mehrere Werte in einer Datenbank
>> speichern muss - entweder ich erstelle dafür eine eigene Tabelle mit den
>> jeweiligen Feldern passend zum Typ des zu speichernden Wertes, oder ich
>> packe alles in ein Array, sage serialize() und packe es in eine
>> Text-Spalte.
>
> Vielleicht könntest Du den Anwendungsfall spezifischer erläutern?
> Relationale Datenbanken sind nicht umsonst relational, ich sehe wenig
> Sinn dahinter, das Prinzip zu unterlaufen, in dem man einen Array
> serialisiert und für die Datenbank unereichbar in einem Textfeld
> abspeichert - mit unereichbar meine ich, dass all die schönen
> Datenbankfunktionen wie sortieren, suchen, eingrenzen, zählen,
> aufsummieren... für die Katz sind.
Vielleicht habe ich mich missverständlich ausgedrückt: Es gibt keinen
konkreten Anwendungsfall, sondern immer nur hier und da Situationen wo
ich denke dass es praktischer ist.
Beispiel: Ich soll eine bestehende Applikation um eine Fähigkeit
erweitern, die 6 Einstellungen benötigt - diese sollen in der DB
gespeichert werden und werden auch insgesamt nur einmal gespeichert. Es
gibt bereits eine Tabelle die alle Konfigurationsdaten enthält, diese
Tabelle hat nur eine Reihe von Daten. An dieser Stelle habe ich dann ein
Textfeld angelegt und dort ein serialisiertes Array hinterlegt, anstatt
6 neue Felder in die Datenbank einzufügen.
Meine Frage war jetzt eher: Ab wann wird ein solches Vorgehen zum
Problem. (Und wollte versuchen offensichtliche Probleme wie Suchen etc.
in den Daten von vornherein auszuschließen, da ich denke dass es
offensichtlich ist in einem solchen Fall eben nicht diese Speichertaktik
zu wählen.)
regards,
Jens
Re: serialize() in Textfeld als Universalspeicher?
am 15.09.2006 13:53:18 von Ulf Kadner
Jens Himmelrath wrote:
> Beispiel: Ich soll eine bestehende Applikation um eine Fähigkeit
> erweitern, die 6 Einstellungen benötigt - diese sollen in der DB
> gespeichert werden und werden auch insgesamt nur einmal gespeichert. Es
> gibt bereits eine Tabelle die alle Konfigurationsdaten enthält, diese
> Tabelle hat nur eine Reihe von Daten. An dieser Stelle habe ich dann ein
> Textfeld angelegt und dort ein serialisiertes Array hinterlegt, anstatt
> 6 neue Felder in die Datenbank einzufügen.
Also hier würde ich eine strikte Datenbank-Normalisierung favorisieren.
Zumal die neuen Daten ja gut zur Tabelle zu passen scheinen.
MfG, Ulf
Re: serialize() in Textfeld als Universalspeicher?
am 15.09.2006 14:20:38 von Niels Braczek
Claus Reibenstein schrieb:
> Niels Braczek schrieb:
>> Claus Reibenstein schrieb:
>>
>>> Serialisierte Werte sollte man immer binär speichern. [...]
>>=20
>> Danke für den Tipp! Das Feld war TEXT, habe ich in BLOB geändert. =
Leider
>> hat das nichts genützt. Inzwischen habe ich aber die Lösung gefund=
en:
>> Das Problem waren die automagischen Slashes.
>=20
> Andere Frage: In welcher Form hast Du die serialisierten Werte (ich sag=
e
> jetzt bewusst nicht "String") an die Datenbank übermittelt? Als
> Textstring (aua!) oder als hexadezimale Ziffern? Letzteres sollte
> eigentlich in jedem Fall funktionieren.
Sie werden jetzt als einfacher String übertragen. Bei einem BLOB-Feld
sollte MySQL den Schutz übernehmen. Ich behalte das aber auf jedem Fall=
im Hinterkopf, falls weiterhin/neue Probleme auftauchen.
MfG
Niels
--=20
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------
Re: serialize() in Textfeld als Universalspeicher?
am 15.09.2006 22:09:06 von Hadanite Marasek
> Beispiel: Ich soll eine bestehende Applikation um eine Fähigkeit
> erweitern, die 6 Einstellungen benötigt - diese sollen in der DB
> gespeichert werden und werden auch insgesamt nur einmal gespeichert. Es
> gibt bereits eine Tabelle die alle Konfigurationsdaten enthält, diese
> Tabelle hat nur eine Reihe von Daten. An dieser Stelle habe ich dann ein
> Textfeld angelegt und dort ein serialisiertes Array hinterlegt, anstatt
> 6 neue Felder in die Datenbank einzufügen.
Mit der Frage habe ich mich auch schon rumgeschlagen. Die Frage ist, ab
wann lohnt es sich neue Spalten einzufügen? Ich hab schon Tabellen mit
fünfzig Spalten gesehen, das ist auch nicht so der Hit.
Eine Spalte mache ich für Werte, die bei fast allen Datensätzen relevant
sind. Beispielsweise wenn ich Menschen erfasse, erfasse ich Grösse,
Gewicht, Geburtsdatum, Augenfarbe.
Für das zusätzliche Merkmal "Politiker" benötige ich kein eigenes
Bool-Feld, weil wenige der Leute Politiker sind.
Also nehme ich einfach eine Verknüpfungstabelle, die die
Datensatztabelle mit einer Liste von zusätzlichen Attributen verknüpft
ist - Politiker, Umweltschützer, Hundefreund, Yale-Absolvent. Die kann
ich dann recht schnell erweitern.
> Meine Frage war jetzt eher: Ab wann wird ein solches Vorgehen zum
> Problem. (Und wollte versuchen offensichtliche Probleme wie Suchen etc.
> in den Daten von vornherein auszuschließen, da ich denke dass es
> offensichtlich ist in einem solchen Fall eben nicht diese Speichertaktik
> zu wählen.)
Es wird sicher dann ein Problem, wenn Du viele Schreib/Änderoperationen
hast.
Re: serialize() in Textfeld als Universalspeicher?
am 18.09.2006 15:59:34 von Stefan Scholl
Stefan Scholl wrote:
> Jens Himmelrath wrote:
>> ich komme regelmäßig an Stellen wo ich mehrere Werte in einer Datenbank
>> speichern muss - entweder ich erstelle dafür eine eigene Tabelle mit den
>> jeweiligen Feldern passend zum Typ des zu speichernden Wertes, oder ich
>> packe alles in ein Array, sage serialize() und packe es in eine Text-Spalte.
>
> Ja, hatte schon viel Spaß beim Debuggen solcher Konstrukte.
Ui, und eben wieder. Macht das Spaß!
Und diesmal ein total anderer Fehler. Statt mit Array war es
diesmal ein verblödetes Objekt.
serialize() rocks!