# XML vs. Datenbank vs. lokale Ordnerstruktur



## JFreak (11. Feb 2008)

Hallo,

ich stehe derzeit vor dem Problem, hierarchisch organisierte Daten über eine Art CMS per JSP auszuliefern. Es handelt sich dabei um eine Seitenhierarchie, bestehend aus teils statisch vorliegenden Seiten (die einfach aus einer Datei gelesen werden könnten) und teils aus dynamischen Seiten, die von externen Plugins erzeugt werden. Das Problem besteht in der nicht-redundanten Datenhaltung.

Folgende Möglichkeiten gibt es:
1) lokale Ordnerstruktur
1.1) einfache Struktur mit Unterordnern und Textdateien
+ schnell und einfach
- Reihenfolge stets lexikografisch
- Mehrsprachlichkeit schlecht handhabbar
- Metadaten schlecht handhabbar
1.2) Erweiterung von 1.1: statt Textdateien XML-Dateien
+ Einfachheit bleibt erhalten
+ Metadaten und Mehrsprachlichkeit bliebe erhalten
- Anlegen eines Caches notwendig, da nicht bei jedem Seitenaufruf die komplette Hierarchie durchgegangen werden kann
1.3) 1 einzige XML-Datei
+ zentrale Verwaltung
+ einfache Handhabbung mittels XSLT
- langsam
- kompletter Inhalt einer Site muss in den RAM bei jedem Aufruf
2) Datenbank
+ volle Möglichkeiten
+ gute Performance
- zusätzlicher DB-Server erforderlich

Z. Zt. habe ich 1.1 implementiert, was aber offensichtlich nicht haltbar ist. Derzeit tendiere ich zu 1.2. Wofür würdet ihr euch entscheiden, unter der Prämisse, dass in einer Produktivumgebung a) häufig Seiten strukturell verändert werden (verschieben/löschen/anlegen); b) häufig Inhalte verändert werden oder c) meist so bleibt wie es ist. Wie sähe ein Kompromiss zwischen a)-c) aus. Ich sehe das momentan so:

a) -> 2
b) -> 1.2
c) -> 1.3 (mit Vorratshaltung der XML-Datei im entsprechend großen RAM des Servers)
Kompromiss -> 1.2

Lars


----------



## ARadauer (11. Feb 2008)

ich würd auf die Datenbank setzen.


----------



## JFreak (11. Feb 2008)

Bei der Datenbanklösung kann ich mir momentan noch kein schönes Tabellenlayout vorstellen. Kannst du mir vielleicht einen Tipp geben? Anforderung: In einen Seitenbaum sollen sich sowohl statische als auch dynamische (von Plugins erzeugte) Seiten eingehängt werden können. Daraus soll aber möglichst einfach ein Inhaltsverzeichnis erzeugt werden können.


----------



## maki (11. Feb 2008)

Wenn es dir nur um das Inhaltsverzeichniss geht, wozu dann die Unterscheidung statisch/dynamisch?

Ansonsten: Es gibt mehrere Möglichekiten Bäume in Tabellen zu speichern, einfachste Möglichkeit die mir jetzt einfällt:

Tabelle Node
---------------
id (PK)
parent (FK), kann auch null sein


----------



## robertpic71 (11. Feb 2008)

JFreak hat gesagt.:
			
		

> ...
> 2) Datenbank
> ..
> - zusätzlicher DB-Server erforderlich



Mit einer embbedded Datenbank wie z.B. H2 (Alternativ: HSQL, Derby) läuft die Datenbank mit dem Java-Webcontainer mit. Also auch dieser Nachteil ist "umgehbar".

Hier noch eine Applikation, die genauso arbeitet: Onlinekatalog
* embedded H2 Datenbank, diese speichert alle html-Seiten
* Datenbankstruktur ungefähr so, wie sie von maki beschrieben wurde
* Seiten via Onlineeditor ändernbar

Für die Anforderungen (statisch/dynamisch) würdest du wohl noch einen Schalter je Treenode brauchen (user darf ändern true/false). 

/Robert


----------



## JFreak (11. Feb 2008)

Ich hab mich vielleicht etwas ungünstig ausgedrückt. Es gibt global einen Seitenbaum, der erstmal nur aus statischen Ordnern und Seiten besteht. Das ist vergleichbar mit einem einfachen Websiteaufbau ohne Skripte. Jetzt sollen allerdings noch in die vorhandenen Ordner ähnlich wie bei "mount" andere Seiten eingehängt werden, die von Plugins erzeugt werden. 
Dabei definiere ich dynamisch als "von URL-Parametern abhängig" und statisch als "nicht von URL-Parametern abhängig".

Beispiel:

Website:
- Startseite
- Projekte
- FAQ
- Galerie

Das ganze kann als statische Struktur angelegt werden. Allerdings soll die Galerie dynamisch sein, d. h. die Inhalte sollen von den URL-Parametern abhängig sein. D. h. ein Plugin "mountet" sich im Verzeichnis / in den Baum mit der id="gallery". Wenn nun /gallery/index z. B. mit dem Parameter "page=0" das Galerie-Plugin beauftragt werden, die Seite darzustellen.

Rufe ich dagegen /faq auf, soll ein statischer Inhalt ausgegeben werden.

Ich hoffe, das ist verständlich, das von Robert kommt dem nahe.

Lars


----------



## JFreak (12. Feb 2008)

Hallo!

so, ich hab ein bisschen umgebaut. Das ganze soll jetzt in eine MySQL-5.1-Datenbank mit XML-Unterstützung. Layout:

pages
-------
id <<PK>>
parentid <<FK>>
name NOT NULL
tags
cms (boolean)
navigation (boolean)

* cms gibt an, ob die Seite durch den Content Manager gehen soll (also Template außenrum, Plug-In aufrufen, Inhalt erzeugen, ausgeben)
* navigation gibt an, ob die Seite im Inhaltsverzeichnis erscheinen soll

content
---------
id <<PK>>
lang NOT NULL, default = *
pageid <<FK>>
content NOT NULL
title NOT NULL

Die hierarchische Struktur ist somit wie von maki vorgeschlagen. Dank MySQLs XML-Fähigkeiten kann ich dann auch den Navigations-Cache wesentlich schneller aufbauen und das Servlet braucht sich nicht mehr darum zu kümmern.

Hat noch jemand Vorschläge dazu?

Lars


----------

