Datenbanklokalisierung

8

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:

%Vor%

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

%Vor%

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

    
Dónal 24.08.2009, 14:54
quelle

4 Antworten

3

Ich denke, es ist in Ordnung. Sie beschreiben eine Eins-zu-Viele-Beziehung zwischen einem Produkt und seinem Lokalisierungstext.

Ich frage mich, ob Sie das Englisch auch lokalisieren sollten, anstatt es in Ihrer Produkttabelle zu denormalisieren.

    
Beth 24.08.2009 15:07
quelle
2

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).

    
gregmac 11.05.2010 15:31
quelle
1

Der richtige Weg, denke ich, wäre, die extra Tabelle zu erstellen, aber gehen Sie dann den zusätzlichen Schritt und entfernen Sie alle sprachspezifischen Ressourcen aus der ersten Tabelle.

Sie hätten also:

Produkt

%Vor%

Produktlokalisierung

%Vor%

Gebietsschema

%Vor%     
DanDan 24.08.2009 15:06
quelle
1

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.

    
bkm 24.08.2009 15:24
quelle