Variable Daten in beide Richtungen
Niki Hammler
- datenbank
Hallo,
Ich will nun eine Homepage bauen, die wirklich bis ins kleinste Detail aus einer Datenbank besteht und bis ins kleinste Detail nach Bedürfnissen angepasst werden kann.
Eine Homepage sieht grundsätzlich so aus: Ein Inhaltsverzeichnis (wie dieses im Endeffekt auf der Seite ist, ist egal, nur in der Theorie einmal) mit beliebig vielen Untermenüs. Jedes dieser Menüs verweist letztendlich auf die Seiten. Im Idealfall geht das noch in beliebig vielen Sprachen.
Mein Datenbank Entwurf für das Menü sieht so aus:
1. Tabelle: ts_menu: ID, parent, t_lang_menuID
----------
Die Wurzel ist "0" (Homepage, Hauptseite). Nun gibt es für jede Seite einen Eintrag: Die ID weist eine eindeutige ID jedem Eintrag zu. parent verweist auf die ID der Oberebene (0 wenn Hauptebene). Und t_lang_menuID verweist auf die zweite Tabelle, in der erst die Sprachen stehen.
2. Tabelle: t_lang_menu: ID, sim, text, t_hplangID
----------
Jedes Wort hat nun einen Eintrag in der Tabelle. Nun wirds aber SCHWIERIG! Da ja beliebig Sprachen möglich sein sollen, zeigt nun ein Eintrag aus "ts_menu" auf eine ID. Nun sollen alle Einträge aus dieser Tabelle, dessen "sim" (von similar) gleich ist, herausgegeben werden, und zwar nicht als REIHE sondern als SPALTE!!
Der dritte Eintrag verweist nun auf die letzte Tabelle, die beschreibt, um welche Sprache es sich handelt!
3. Tabelle: t_hplang: ID, text
----------
ID: Eindeutige ID, text: Die Sprache.
Wie kann denn dieses Mega Unterfangen funktionieren? Im Prinzip brauch' ich nur wissen, wie ich aus Reihen Spalten bei einer Abfrage mach' und die mit dem Rest verknüpfe!
Nun Ein BEISPIEL zum besseren Verständnis:
Die Homepage hat nur eine Seite: "Über mich".
ts_menu:
ID | parent | t_lang_menuID
---+--------+-------------
1 | 0 | 1
Die ID ist egal, einfach eindeutig und automatisch inkrementiert. parent steht auf null, weil sich die Seite bereits in der Wurzel befindet. t_langmenuID weist nun auf eine ID in der nächsten Tabelle
t_lang_menuID:
ID | sim | text | t_hplangID
---+-----+-----------+------------
1 | 0 | Über mich | 1
2 | 0 | About me | 2
3 | 0 | C'est moi | 3
Jedem Eintrag ist also eine eindeutige ID zugewiesen. Wenn Einträge zusammengehören, ist die "sim" dieser ID die gleiche. t_hplangID ist ein Verweis auf die nächste Seite
t_hplang:
ID | text
1 | Deutsch
2 | English
3 | Francais
Zum Schluss der Abfrage soll die Seite in dieser Form rauskommen:
1 | 0 | Deutsch | Über mich | English | About me | Francais | C'est moi
oder:
1 | 0 | 1 | Über mich | 2 | About me | 3 | C'est moi
wobei:
1. Spalte: ID des Menüeintrags (der Seite)
2. Spalte: Zeiger auf die obere Ebene
3. Spalte: erste Sprache (Deutsch) oder eine ID darauf
4. Spalte: Name des Eintrags in Deutsch
5. Spalte: erste Sprache (Englisch) oder eine ID darauf
6. Spalte: Name des Eintrags in Englisch
7. Spalte: erste Sprache (Französisch) oder eine ID darauf
8. Spalte: Name des Eintrags in Französisch
Natürlich fehlen viele Einzeilheiten und die eigentlichen Seiten fehlen auch noch, aber mir geht es einmal um die Struktur des Menüs.
Kann mir wer helfen oder auch nen Tipp geben wie man sowas professionnell löst, wenn es variable Daten in beide Richtungen gibt aber man nicht für alles eine eigene Tabelle anlegen will?
Danke Niki
Halihallo Niki
Ich will nun eine Homepage bauen, die wirklich bis ins kleinste Detail aus einer Datenbank besteht und bis ins kleinste Detail nach Bedürfnissen angepasst werden kann.
Dann ist evtl. XML die bessere wahl, da das Schema dort Teil des Datensatzes ist.
Eine Homepage sieht grundsätzlich so aus: Ein Inhaltsverzeichnis (wie dieses im Endeffekt auf der Seite ist, ist egal, nur in der Theorie einmal) mit beliebig vielen Untermenüs. Jedes dieser Menüs verweist letztendlich auf die Seiten. Im Idealfall geht das noch in beliebig vielen Sprachen.
Hierarchische Strukturen liessen sich mit XML auch besser abbilden, aber zurück zur DB:
- Tabelle: ts_menu: ID, parent, t_lang_menuID
- Tabelle: t_lang_menu: ID, sim, text, t_hplangID
- Tabelle: t_hplang: ID, text
Mein Vorschlag:
Tabelle Menu: menu_id, parent_menu_id, description_id (menu_id ist PRIMARY,
description_id FOREIGN KEY)
Tabelle MenuTranslation: description_id, language_id, description (wobei description_id
_und_ language_id PRIMARY KEY ist)
Tabelle Language: language_id, language_name (language_id PRIMARY KEY)
Die Sprache sollte von der hierarchischen Struktur getrennt sein, du vermischst diese.
Es sind jedoch zwei völlig andere Dinge.
Wie kann denn dieses Mega Unterfangen funktionieren?
Was macht es denn so kompliziert?
Zum Schluss der Abfrage soll die Seite in dieser Form rauskommen:
1 | 0 | Deutsch | Über mich | English | About me | Francais | C'est moi
1 | 0 | 1 | Über mich | 2 | About me | 3 | C'est moi
Das wird nicht möglich sein; ausser du hast ein Attribut für jede Sprache, du bildest
diese jedoch in verschiedene Datensätze ab, folglich wirst du auch Zeilen und nicht
Spalten bekommen. Es gibt in SQL keine Möglichkeit, Zeilen in Spalten abbzubilden.
---
Warum willst du jede Sprache einlesen? - Das Menü wird ja wohl nur in einer Sprache
ausgegeben; jede andere Sprache zu selektieren wäre aperformant und verbraucht Speicher.
Dein Vorhaben, alle Sprachen als Spalten auszugeben, ist gar nicht nötig.
Viele Grüsse
Philipp