Ich habe eine Anzahl von Datenbanktabellen, die die Spalten name
und description
enthalten, die lokalisiert werden müssen. Mein erster Versuch, ein DB-Schema zu entwerfen, das dies unterstützen würde, war etwa so:
Diese Lösung erfordert jedoch eine neue Tabelle local_
für jede Tabelle, die Spalten name
und Beschreibung enthält, für die localization
erforderlich ist. Um diesen Overhead zu vermeiden, habe ich das Schema so umgestaltet, dass nur eine einzige localization
-Tabelle benötigt wird
Hier ist ein Beispiel für die Daten, die in diesem Schema gespeichert werden, wenn es zwei Tabellen (Produkt und Land) gibt, die eine Lokalisierung erfordern:
Land
%Vor%Produkt
%Vor%Lokalisierung
%Vor%Gebietsschema
%Vor% Beachten Sie, dass der zusammengesetzte Primärschlüssel der Tabelle localization
(id, locale_id)
ist, der Fremdschlüssel in der Tabelle product
jedoch nur auf das erste Element dieser zusammengesetzten PK verweist. Dies scheint eine "schlechte Sache" aus dem POV der Normalisierung zu sein.
Gibt es eine Möglichkeit, dieses Problem zu beheben, oder gibt es alternativ ein vollständig anderes Schema, das die Lokalisierung unterstützt, ohne eine separate Tabelle für jede lokalisierbare Tabelle zu erstellen?
Aktualisierung:
Eine Reihe von Befragten hat eine Lösung vorgeschlagen, die das Erstellen einer separaten Tabelle für jede lokalisierbare Tabelle erfordert. Genau das versuche ich jedoch zu vermeiden. Das Schema, das ich oben vorgeschlagen habe, löst das Problem fast zu meiner Zufriedenheit, aber ich bin nicht glücklich darüber, dass die Fremdschlüssel localization_id
sich nur auf einen Teil des entsprechenden Primärschlüssels in der Tabelle localization
beziehen.
Danke, Don
Ich mag die Idee, würde aber einen Schritt in die andere Richtung gehen und einen Lokalisierungseintrag für jede übersetzte Spalte haben:
Land
%Vor%Produkt
%Vor%Lokalisierung
%Vor%locale
%Vor%Die PK der Lokalisierung ist (id, locale_id). Es ist kein Problem, dass id auch in mehreren anderen Tabellen eine FK-Referenz ist. Sie können einen Ersatz-PK hinzufügen, wenn Sie möchten, solange Sie noch einen eindeutigen Index für (id, locale_id) haben.
Das Schöne daran ist, es ist eine einzige Lokalisierungstabelle, und es funktioniert für jede Tabelle in Ihrem Schema, unabhängig davon, welche Felder es hat (Sie sind nicht beschränkt auf Namen und Beschreibung von allem, was lokalisiert wird). Der Nachteil ist ein potenzieller Performance-Hit bei der Verwendung der Lokalisierungstabelle - obwohl Sie möglicherweise das Ganze für eine gegebene locale_id einfach zwischenspeichern könnten. Wenn Sie also Einträge suchen, müssen Sie nur nach der gegebenen ID suchen (da Ihr Cache ist basierend auf der Sprache bereits eingegeben).
Sie könnten auch erwägen, Standardnamen- und -beschreibungsfelder in der Produkttabelle zu belassen, die für den Fall verwendet werden, dass ein Eintrag für die aktuelle Sprache fehlt, oder wenn der Benutzer die Sprache nicht eingegeben hat. Dies ist auch der Fall, wenn Sie eine vorhandene App portieren, in der Sie bereits Werte haben (ohne Gebietsschema-Informationen).
Wenn ich richtig verstehe, liegt Ihr Problem nur daran, dass Sie die gleiche Sprachlokalisierung für Name und Beschreibung in mehr als einer Tabelle verwenden möchten. In einem solchen Szenario können Sie die Produkt-ID nicht in der Lokalisierungstabelle hinzufügen. Ein weiteres Problem in Ihrem Design ist, dass es nicht mehr als eine Sprachlokalisierung für das gleiche Produkt elegant handhaben kann. Du könntest es zwicken, um zu arbeiten:
Wenn Name und Beschreibung die einzigen Felder sind, die eine Lokalisierung erfordern, können Sie Folgendes tun:
Produkt (ID, Name, Beschreibung, tanslation_row_id)
Produktübersetzungen (ID, Name, Beschreibung, lang_id, Übersetzungs-ID)
Die translation_row_id ist ein Fremdschlüssel, der auf Product_translations.ID verweist Die Übersetzungs-ID verweist jedoch auf einen übergeordneten Datensatz in derselben Tabelle, der als allgemeiner Datensatz für alle sprachspezifischen Datensätze dienen würde.
Beispieldatensätze
Produkt
%Vor%Produktübersetzungen
%Vor%Wenn Sie einen Sprachcode angeben, können Sie den Namen und die Beschreibung mithilfe der SQL-Abfrage
extrahieren %Vor%Wichtiger Hinweis: Ich nehme an, dass die Produkttabelle viele weitere Attribute hat, die diese Übersetzung nicht benötigen. '& amp; langID' ist ein Parameter für die SQL-Abfrage, der den Benutzer nach dem Sprachcode seiner Wahl fragt.
Tags und Links database-design internationalization schema