phpbar.de logo

Mailinglisten-Archive

[php] speichern von XML in MySQL

[php] speichern von XML in MySQL

Lutz Zetzsche Lutz.Zetzsche at sea-rescue.de
Die Okt 23 09:25:33 CEST 2007


Hallo Stephan,

Am Dienstag, 23. Oktober 2007 schrieb Stephan Krauß:
> Als Anstifter der Diskussion will ich noch einige Gedanken
> nachschieben. Wir wollen eine Suppendatenbank aufbauen die
> Suppenrezepte verwaltet. Nun haben wir uns gedacht das wir die
> Zutaten (Gewürze,Salz,Pfeffer ...) als XML speichern.
>
> Zum einen wollen wir damit eine astronomische Anzahl von Datensätzen
> verhindern. Zum anderen wollen wir Klassen schreiben die an Hand der
> Tags soweit intelligent sind das die Rezepte vernünftig dargestellt
> werden.
>
> Die Fragestellung geht dahin ob die Einlagerung von XML - Dateien
> in eine MySQL nicht prinzipiell verpönt ist.

letztlich geht es eigentlich um den Grund, warum man etwas in der 
Datenbank speichert. Es gibt gute und schlechte Gründe. :-)

Ich speichere z.B. kleine HTML-Schnipsel für Links etc. in der Datenbank 
und nicht auf der Festplatte, weil es ansonsten auf jeder einzelnen 
Seite und auf der gesamten Website insgesamt viel zu viel 
Festplattenzugriffe gäbe. Pro Seite werden 25 Links dargestellt, wobei 
die Daten dazu in vier normalisierten Tabellen plus einer Cache-Tabelle 
abgelegt sind und die Links auch beliebig kombiniert werden können. Das 
Cachen einer gesamten Seite kommt daher in dieser Konstellation nicht 
in Frage.

Aber nun zu Deiner Aufgabenstellung:

Da Ihr XML offensichtlich als Datenablage verwenden wollt, müßt Ihr Euch 
entscheiden, was Ihr wollt: Ablage in XML-Dateien, in einer 
XML-Datenbank oder in einer MySQL-Datenbank. Es macht sicherlich in 
Eurem Fall keinen Sinn, die XML-Struktur in der relationalen Datenbank 
wie MySQL abzulegen.

Ich kann mir auch schwer vorstellen, daß es eine astronomische Zahl von 
Datensätzen geben wird. Ich meine, selbst wenn es eine Million 
Suppenrezepte gäbe, wäre das doch für MySQL kein Problem.

Wenn Ihr die Daten anständig normalisiert, z.B. Zutaten nur einmal in 
einer Zutatentabelle vorhaltet und dann mit einer Relationentabelle mit 
den Rezepten verknüpft, läßt sich die Datenmenge zu einem sehr gut 
reduzieren und zum anderen auch hervorragend durchsuchen. Auch 
performant, wegen der geringeren Datenmenge aufgrund der 
Normalisierung.

Ich würde also als Basis Eurer Suppendatenbank eine vollständig 
normalisierte MySQL-Datenbank nehmen. Jetzt ist es natürlich so, daß 
eine vollständig normalisierte Datenbank nicht unbedingt die 
performanteste Lösung sein muß. Dafür kannst Du aber dann aber 
zusätzlich Query-Caches, Caching-Tabellen, Views, Cache-Dateien etc. 
verwenden.

Wenn der Hintergrund Eurere Überlegungen sein sollte, die Daten sinnvoll 
in Objekte zu überführen, dann guck Dir mal ORM an:

http://de.wikipedia.org/wiki/Objektrelationale_Abbildung

Es gibt ORM-Mapper, die dafür sorgen, daß relational in der Datenbank 
abgelegte Daten in der Anwendung in Objekten verfügbar sind.

Solltest Du Drittanbieter mit XML-Daten versorgen wollen, z.B. per RSS, 
REST oder SOAP, dann kannst Du die benötigten XML-Daten problemlos aus 
der Datenbank generieren. Da sich Deine Daten mit Sicherheit kaum 
ändern werden, nachdem sie eingestellt worden sind, wirst Du hier auch 
keinen unverhältnismäßigen Generierungs- bzw. Caching-Aufwand haben.

Dasselbe gilt natürlich für die Ausgabe auf der Website. Einmal mit 
Smarty oder PEAR::Cache das Rezept generieren und cachen und 
fertig. :-)


Viele Grüße,
Lutz

php::bar PHP Wiki   -   Listenarchive