[PHP] Einträge Speichern: XML vs. Datenbank

Hallo,

ich bin gerade dabei mir nen kleinen Blog zu schreiben und überlege gerade, was wohl die bessere Möglichkeit wäre die einzelnen Einträge zu speichern.

Weil ich früher sowas hauptsächlich mit ner MySQL-Datenbank realisiert habe, wollte ich es mir diesmal etwas einfacher machen: Ich speichere mit PHP den Text in einer .xml-Datei (mit simplexml), welche gleichzeitig als RSS-feed dient.

Meine Frage ist jetzt allerdings: Welche Variante ist vorzuziehen? In Sachen Performance, Sicherheit oder Erweiterbarkeit?

Danke schonmal für eure Antworten.

~ Henry

[edit:] Ich seh grad, dass es ne extra Sektion für Webgeschichten gibt. Vielleicht können die Mods den thread ja verschieben.
 
Zuletzt bearbeitet:
Also ich denke einer richtigen Datenbank ist da eindeutig der Vorzug zu geben.

XML ist eher als Datenformat geeignet. Also dann wenn immer die kompletten Daten gelesen/geschrieben werden müssen. Du greifst aber immer nur auf einen kleinen Teil der Daten zu. Ab einer gewissen Anzahl von Einträgen wird die XML Variante miserabel skalieren.

Du wirst auch Probleme bekommen, sobald der Datenbestand von mehreren PHP-Prozessen paralell bearbeitet werden soll. Daten auf Dateisystem Ebene zu behandeln (was man mit XML tut) ist immer eine schlechte Idee, weil man es dann mit genau den Problemen zu tun hat die durch Datenbanksysteme gelöst wurden.

Verwenden könntest zu SQLite, PHP: SQLite - Manual
Deine Daten werden dann im Endeffekt auch nur in einer Datei auf der Fesplatte gespeichert, aber du hast die Vorzüge eines Datenbanksystems.
 
Ok, vielen Dank!

Ich hatte wohl irgendwie noch im Kopf, dass ne Datenbank eher ein Performanceverlust bedeutet. Da wollt ichs mir wohl zu einfach machen...

Die Sache mit SQLite hört sich gut an, aber da spielt wohl mein webspaceanbieter nicht mit.

~ Henry
 
Wenn dein Webspace Anbieter PHP anbietet, ist es imho auch sehr wahrscheinlich, dass SQLite Unterstützung vorhanden ist. Das gehört zu den standard Features von PHP.
 
Also wenn man wirklich ein Blog noch selbst schreiben will, sollte man unbedingt eine Datenbank wie MySQL verwenden. Natürlich braucht eine DB ein bisschen Performance, aber wenn man seine Queries nicht ganz dämlich schreibt ist das heute kein Problem mehr
 
XML ist eher als Datenformat geeignet. Also dann wenn immer die kompletten Daten gelesen/geschrieben werden müssen. Du greifst aber immer nur auf einen kleinen Teil der Daten zu. Ab einer gewissen Anzahl von Einträgen wird die XML Variante miserabel skalieren.
Es kommt darauf an, wie man die XML-Struktur aufbaut und ob man alles in eine Datei packt oder auf viele Dateien aufteilt. Diverse Suchmaschinen nutzen z.B. als Index XML-Dateien und skalieren damit weitaus besser als es mit einer Datenbank überhaupt möglich wäre.

Du wirst auch Probleme bekommen, sobald der Datenbestand von mehreren PHP-Prozessen paralell bearbeitet werden soll. Daten auf Dateisystem Ebene zu behandeln (was man mit XML tut) ist immer eine schlechte Idee, weil man es dann mit genau den Problemen zu tun hat die durch Datenbanksysteme gelöst wurden.
Auch das würde ich so pauschal nicht sagen. Mit ausreichend Festplatten-Cache oder gar RAM-Disks können die Zugriffe auf XML-Daten weitaus schneller sein als bei einer DB, die ihre Indexes erst in den RAM laden muss und wo Volltext-Suchen z.B. zumeist eher langsam sind. Hinzu kommt der Overhead, der bei DB-Zugriffen verursacht wird. Ausserdem hat man auf Dateisystemebene nicht das Problem der gelockten Daten, wie man sie z.B. von MyISAM-Tabellen u.a. kennt, die Volltextsuchen ermöglichen.

Allerdings denke ich auch, dass man bei einem Blog durchaus bei einer DB bleiben kann. 1. wird es von den meisten Webspace-Anbietern heutzutage angeboten, während der Plattenplatz oft stark eingeschränkt ist und 2. hat kaum ein Blog soviele Einträge, dass sich XML als Datenformat wirklich lohnen würde. In bestimmten Bereichen würde er vermutlich sogar schlechter skalieren (z.B. bei Archiv-Funktionen). Ausserdem ist eine Anpassung an einer Tabellenstruktur einfacher gemacht als wenn man diese Anpassung in einem XML-Schema für mehrere dutzend oder gar hundert Dateien machen muss.

Meine Einschätzung zu den 3 genannten Punkten:

Performance: XML +, Datenbank -
Sicherheit: hängt vom PHP-Code ab, allerdings kennt SQL-Injections jedes Skript-Kiddy, während die Notwendigkeit zur Manipulation von XML-Daten bei Blogs wohl von den wenigsten Angreifern erwartet wird; die werden erstmal versuchen SQL-Injections zu fahren ;)
Erweiterbarkeit: XML --, Datenbank +
 
Ich würde einfach sagen: Nimm einfach das, worauf du Lust hast.

Performance:
Bei MySQL hast du natürlich die Kommunikation mit der Datenbank, die Overhead verursacht. Dafür kann sie das Caching für dich übernehmen. Bei Verwendung von XML wirst du vermutlich für jeden Seitenaufruf das XML-Dokument parsen müssen, was deutlich mehr Overhead bedeutet. MySQL läuft ja weiter, und hier liegen die Daten strukturiert im Speicher, der Zugriff ist damit schneller. Hier sehe ich also MySQL vorne.
Wenn du wirklich stark skalieren willst, ist allerdings weder MySQL noch XML geeignet, hier brauchst du einen Cache, der dir die fertig generierten Seiten im RAM vorhält. (->memcached)
@bitmuncher: Welche Datenbanken setzen eigentlich speziell auf XML-Dateien zur Geschwindigkeitsoptimierung? Mir ist da gerade keine bekannt.

Sicherheit:
Wie Bitmuncher bereits gesagt hat: Wenn du keine Prepared Statements verwendest, hast du bei Verwendung von MySQL evtl. das Problem von SQL-Injections. Das ist aber bei MySQL als reiner Content-Quelle (d.h. nicht auch noch Passwort-Speicher) aber nicht so das Problem, solange du keine geheimen Daten speicherst.
Bei XML musst du natürlich genau so die Eingaben prüfen. Auch hier könnte dir jemand z.B. XML-Tags einschmuggeln, die dafür sorgen, dass deine Datenbank kaputt geht, oder dass dein Server Dinge anzeigt, die er nicht anzeigen sollte.
Hier sehe ich also keinen klaren Sieger.

Erweiterbarkeit:
Hier kommt es auf deinen Code an, und es ist wichtig, wie du gerne Daten ablegen möchtest. MySQL erweiterst du durch das Anlegen von weiteren Spalten, XML durch das Hinzufügen von Tags oder Feldern.

Auch eine Datenverwaltung auf XML-Basis ist einfach erweiterbar. Wenn du ein neues Datenfeld brauchst, dann fügst du das einfach nur bei neu angelegten oder aktualisierten XML-Dateien hinzu. Soll dann z.B. ein alter Eintrag angezeigt werden, der das Feld noch nicht hat, dann erkennt dein Code das und lädt einen Default-Wert.

Charakteristisch ist hier, dass du dir bei MySQL mehr Gedanken um die Struktur der Daten machen musst, und dass jeder Eintrag immer die gleichen Felder haben muss. Bei XML kannst du einfach alle Daten reinkippen, so wie du die gerade brauchst, musst dir aber beim Auslesen ein paar mehr Gedanken machen.
 
Wie Bitmuncher bereits gesagt hat: Wenn du keine Prepared Statements verwendest, hast du bei Verwendung von MySQL evtl. das Problem von SQL-Injections. Das ist aber bei MySQL als reiner Content-Quelle (d.h. nicht auch noch Passwort-Speicher) aber nicht so das Problem, solange du keine geheimen Daten speicherst.

Code:
SELECT ... INTO OUTFILE ...
SQL-Injections bedeutet nicht nur das Auslesen von "geheimen" Daten. Die Angriffsvektoren sind schon etwas vielfältiger.

Micha
 
Da hast du recht. Man muss natürlich auch noch beim Einrichten der Datenbank aufpassen, dass man da keine Fehler macht. Zum Beispiel sollte man sich nicht mit einem Benutzer anmelden, der mehr Berechtigungen als nötig hat. Afaik braucht man das "FILE"-Privileg, um durch SQL Dateien zu lesen und zu schreiben, oder?
Außerdem muss man auf so Dinge aufpassen wie, dass man mit einem Aufruf von mysql_query nicht mehrere Queries starten kann. Dann könnte man nach einem SELECT-Aufruf ein UPDATE/DELETE laufen lassen. Ich kenne mich mit der Einrichtung von MySQL allerdings nicht so aus, und würde mir das auch nicht zutrauen.
Einigen wir uns auf: Man sollte auf jeden Fall prepared statements benutzen? ;)
 
@bitmuncher: Welche Datenbanken setzen eigentlich speziell auf XML-Dateien zur Geschwindigkeitsoptimierung? Mir ist da gerade keine bekannt.
Ich sprach nicht von Datenbanken, sondern von Suchmaschinen, die mit XMLs als Index arbeiten.

Auch eine Datenverwaltung auf XML-Basis ist einfach erweiterbar. Wenn du ein neues Datenfeld brauchst, dann fügst du das einfach nur bei neu angelegten oder aktualisierten XML-Dateien hinzu. Soll dann z.B. ein alter Eintrag angezeigt werden, der das Feld noch nicht hat, dann erkennt dein Code das und lädt einen Default-Wert.
Hach, wenn es doch so einfach wäre. Ich hab bis vor einigen Monaten in einer Firma gearbeitet, die sich auf Suchen für Websites spezialisiert hat. Wenn dort das Index-Schema geändert wurde, bedeutete dies bei grossen Indexes jedes Mal mehrere Stunden zum "Konvertieren" der XML-Dateien in's neue Format. So einfach ist die Erweiterung also nicht, vor allem dann nicht, wenn Felder/Tags hinzukommen, die nicht einfach mit Default-Werten belegt werden können, weil ihr Wert abhängig von anderen Feldern/Tags sein muss. Und das ist leider häufiger der Fall als man vermuten würde.
 
Zurück
Oben