it-swarm.com.de

Was sind Best Practices für das mehrsprachige Datenbankdesign?

Was ist der beste Weg, um eine mehrsprachige Datenbank zu erstellen? Das Erstellen einer lokalisierten Tabelle für jede Tabelle macht das Entwerfen und Abfragen komplex. In anderen Fällen ist das Hinzufügen von Spalten für jede Sprache einfach, aber nicht dynamisch. Bitte helfen Sie mir zu verstehen, welche für Unternehmensanwendungen am besten geeignet ist

177
Arsen Mkrtchyan

Wir erstellen zwei Tabellen für jedes mehrsprachige Objekt.

Z.B. Die erste Tabelle enthält nur sprachneutrale Daten (Primärschlüssel usw.) und die zweite Tabelle enthält einen Datensatz pro Sprache, der die lokalisierten Daten plus den ISO-Code der Sprache enthält.

In einigen Fällen fügen wir ein DefaultLanguage-Feld hinzu, damit wir auf diese Sprache zurückgreifen können, wenn für eine bestimmte Sprache keine lokalisierten Daten verfügbar sind.

Beispiel:

Table "Product":
----------------
ID                 : int
<any other language-neutral fields>


Table "ProductTranslations"
---------------------------
ID                 : int      (foreign key referencing the Product)
Language           : varchar  (e.g. "en-US", "de-CH")
IsDefault          : bit
ProductDescription : nvarchar
<any other localized data>

Mit diesem Ansatz können Sie so viele Sprachen wie nötig bearbeiten (ohne zusätzliche Felder für jede neue Sprache hinzufügen zu müssen).


Update (2014-12-14): Schauen Sie sich diese Antwort an, um zusätzliche Informationen über die Implementierung zu erhalten, mit der mehrsprachige Daten in eine Anwendung geladen werden.

197
M4N

Ich empfehle die Antwort von Martin.

Aber Sie scheinen besorgt darüber zu sein, dass Ihre Abfragen zu komplex werden:

Das Erstellen einer lokalisierten Tabelle für jede Tabelle macht das Entwerfen und Abfragen komplexer ...

Sie denken also, anstatt einfache Abfragen wie diese zu schreiben:

SELECT price, name, description FROM Products WHERE price < 100

... müssten Sie anfangen, Fragen wie diese zu schreiben:

SELECT
  p.price, pt.name, pt.description
FROM
  Products p JOIN ProductTranslations pt
  ON (p.id = pt.id AND pt.lang = "en")
WHERE
  price < 100

Keine sehr schöne Perspektive.

Aber anstatt es manuell zu tun, sollten Sie Ihre eigene Datenbankzugriffsklasse entwickeln, die die SQL-Anweisungen, die Ihr spezielles Lokalisierungs-Markup enthalten, voranalysiert und in die SQL-Anweisungen konvertiert, die Sie an die Datenbank senden müssen.

Die Verwendung dieses Systems könnte ungefähr so ​​aussehen:

db.setLocale("en");
db.query("SELECT p.price, _(p.name), _(p.description)
          FROM _(Products p) WHERE price < 100");

Und ich bin sicher, dass Sie das noch besser können.

Der Schlüssel ist, dass Ihre Tabellen und Felder einheitlich benannt werden.

14
Rene Saarsoo

Ich finde, dass diese Art der Annäherung für mich arbeitet:

 Produkt Produktdetail Land 
 ==================================== .____.] ProductId ProductDetailId CountryId 
 - etc - ProductId CountryName 
 CountryId Language 
 ProductName - etc - 
 ProductDescription 
 - etc - 

Die ProductDetail-Tabelle enthält alle Übersetzungen (für Produktnamen, Beschreibung usw.) in die Sprachen, die Sie unterstützen möchten. Je nach den Anforderungen Ihrer App möchten Sie möglicherweise die Ländertabelle aufteilen, um auch regionale Sprachen zu verwenden.

13
Nick

Ich benutze den nächsten Ansatz:

Produkt

ProductID OrderID, ...

Produktinformation

ProductID Title Name LanguageID

Sprache

SpracheID Name Kultur, ....

9
omoto

Martins Lösung ist meiner sehr ähnlich, aber wie würden Sie mit einer Standardbeschreibung umgehen, wenn die gewünschte Übersetzung nicht gefunden wird?

Wäre dafür ein IFNULL () und eine weitere SELECT-Anweisung für jedes Feld erforderlich?

Die Standardübersetzung wird in derselben Tabelle gespeichert, wobei ein Flag wie "isDefault" angibt, ob die Beschreibung die Standardbeschreibung ist, falls für die aktuelle Sprache keine gefunden wurde.

2
doM