phpbar.de logo

Mailinglisten-Archive

[php] [OT] Datenbankdesign mit Mehrsprachigkeit

[php] [OT] Datenbankdesign mit Mehrsprachigkeit

Yannik Hampe yannik at cipher-code.de
Don Nov 23 22:09:36 CET 2006



Ralf Eggert wrote:
> Hallo Liste,
> 
> ich weiß, dass die Frage off-topic ist. Da hier aber viele gestandene
> Webentwickler mitlesen, hoffe ich, dass mir jemand helfen kann.
> 
> Ich habe eine Datenbanktabelle "Mensch". Neben Feldern wie Name, Größe
> und Gewicht, in denen Werte frei eingeben werden können, gibt es auch
> Felder wie Augenfarbe, Haarfarbe und Familienstand, welche nur bestimmte
> Vorgabewerte aufnehmen dürfen. Diese Vorgabewerte sollen mehrsprachig
> verwaltet werden.
> 
> Wie lege ich nun diese Vorgabewerte am besten an? Als Beispiel nehme ich
> mal Familienstand.
> 
> 1. Ich verwende ein ENUM Feld, in denen alle möglichen Werte in einer
>    Sprache vorgegeben werden. Die Übersetzungen werden dann aus einer
>    anderen Quelle gelesen.
> 
> 2. Ich erstelle eine eigene Tabelle "Familienstand". Der
>    Primärschlüssel besteht aus einer eindeutigen Id, dem
>    Sprachschlüssel und der Bezeichnung. Die ID wird als Fremdschlüssel
>    in Tabelle "Mensch" verwendet.
> 
> 3. Ich erstelle eine eigene Tabelle "Familienstand" mit einem
>    Primärschlüssel und einem Bezeichnerfeld, das ein serialisiertes
>    Array bestehend aus Sprachschlüssel und Bezeichnung enthält.
Das klingt so, als würdest du sowas in eine include-Datei speichern,
aber doch nicht in einer DB...
Von so einer Konstruktion würde ich die abraten, denn das macht deutlich
weniger Spass zu debuggen, weil man nichtmehr auf einem Blick sieht, was
in dem Array jetzt eigentlich drin steht...
> 
> 4. Ich erstelle eine XML Datei, welches die Daten für den Familienstand
>    enthalten. Jede Entität in der XML Datei enthält die Bezeichnungen
>    in den Sprachen. In Tabelle "Mensch" gibt es ein Feld für den
>    "Familienstand", mit dem Schlüssel aus der XML Datei.
> 
Halte ich für weniger performant (xml ist tendenziell eher langsam (viel
Overhead)), aber es wäre eine Möglichkeit. Es wäre evntuell schneller in
einer includedatei einfach eienn Array zu speichern...

> Verwendet habe ich in der Vergangenheit bereits 1. und 2. Jetzt überlege
> ich, ob 3. und/oder 4. vielleicht besser geeignet sind.

Wie du schon merkst, stehe ich deinen Möglichkeiten 3 und 4 nicht so
offen gegenüber.
Nummer 1 kombiniert mit einer includedatei für jede Sprache halte ich
für am besten. Du kannst dann in der Programmierung immer die Spalte mit
+0 abfrage und kannst so schnelle numerische Arrays benutzen.
Trotzdem siehst du in phpmyadmin (oder was immer du verwendest) sofort,
was drin steht. Und es ist bestimmt deutlich performanter als Möglichkeit 2.

Der Vorteil von 2 ist die Erweiterbarkeit... Wenn du mal eben schnell
noch einen Familienstand hinzufügen möchtest (ok, eher unwahrscheinlich
in dem Beispiel, aber nehmen wir mal an...), dann hast du das mit einem
query erledigt. Bei Enum zwar theoretisch auch, aber wenn du den wert
vom Enum häufig veränderst, macht das mit einer extra-Tabelle viel mehr
Spass.

Wobei du dir wirklich überlegen solltest, ob es sinnvoll ist
übersetzungen so tief in deine Skripte einzubetten...
Alternativ gibt es im einfachsten Fall assoziative Arrays. Im
fortgeschrittenen Fall gibt es dann gettext und ggf. auch was mit
DB-Anbindung.
Mit so einer Trennung zwischen Programmierung und Übersetzung bist du im
Zweifelsfall flexibler. Du kannst auch einfach die gettext-Datei einfach
weitergeben, wenn du jemanden suchst, der sie dir übersetzt usw. Wenn du
übersetzungen so direkt in die DB einbaust, bist du immer gelich bei
jeder Änderung daran gebunden in deinen DB-Strukturen rumzufummeln, die
im schlimmsten Fall alle Sprachsachen über 20 Tabellen verteilen.
> 
> Wie setzt Ihr solche Daten in euren Projekten um?
> 
> Gruß,
> 
> Ralf

Yannik

php::bar PHP Wiki   -   Listenarchive