phpbar.de logo

Mailinglisten-Archive

[php] [OT] Datenbankdesign mit Mehrsprachigkeit

[php] [OT] Datenbankdesign mit Mehrsprachigkeit

Lutz Zetzsche Lutz.Zetzsche at sea-rescue.de
Don Nov 23 22:10:43 CET 2006


Hi Ralf,

Am Donnerstag, 23. November 2006 21:56 schrieb Ralf Eggert:
> 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.
>
> 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.
>
> Verwendet habe ich in der Vergangenheit bereits 1. und 2. Jetzt
> überlege ich, ob 3. und/oder 4. vielleicht besser geeignet sind.
>
> Wie setzt Ihr solche Daten in euren Projekten um?

ich wähle grundsätzlich erst einmal Lösung 2. Lösung 1. und 4. haben den 
Nachteil, daß die Daten auch von außerhalb gezogen werden, so daß die 
Datenbank alleine nicht mehr selbsterklärend und vollständig ist. 
Lösung 3. finde ich nicht gut, weil sie schon anwendungsbezogen ist und 
die Daten nicht mehr normalisiert und im Klartext abgelegt sind.

Wenn es Dir um eine Reduzierung der Datenbankzugriffe und der 
Operationen zur Laufzeit geht, dann empfehle ich Dir eine Kombination 
aus 2. und einem irgendwie gearteten Cache.

Das ist immer mein Ansatz. Also die Datenbank immer schön normalisieren 
und die Daten zusammenhalten, so daß die Daten selbsterklärend bleiben. 
Darauf aufbauend dann gegebenenfalls Daten in einem Cache 
zusammenziehen und in der Anwendung dann auf die gecachten Daten 
zugreifen.

Mal ein praktisches, wenn auch noch sehr einfaches Beispiel:

Ich habe bei mir eine Tabelle mit Übersetzungen in der Datenbank. Daraus 
generiere ich für jede Sprache eine fertige PHP-Datei mit den 
Übersetzungen in einem Array. In den PHP-Seiten binde ich dann einfach 
die passende Übersetzungsdatei ein und spare mir so den 
Datenbankzugriff und die darauffolgende Verarbeitung.

Oder ein weiteres Beispiel:

Ich ziehe alle Daten aus den verschiedenen Tabellen in einer 
Suche-Tabelle zusammen und suche dann schnell über die dort 
zusammengezogenen Daten.

Ich hoffe, es wird deutlich, was ich meine. :-)


Viele Grüße
Lutz

php::bar PHP Wiki   -   Listenarchive