Antwort

11

Zuerst sicherstellen, dass die database locale mit verschiedenen Sprachen umgehen kann. Verwenden Sie eine UTF-8-Servercodierung. Setzen Sie optional LC_COLLATE = 'C' auf neutralen Grund oder verwenden Sie eine Sortierung für Ihre erste Sprache, um eine Standardsortierreihenfolge zu erhalten. Beginnen Sie mit dem Lesen des Kapitels Collation Support im Handbuch.

Ich würde dringend empfehlen, dass Sie die neueste Version von PostgreSQL (9.1 zum Zeitpunkt des Schreibens) verwenden, da es eine bessere Sortierungsunterstützung bietet.

Wie für die Tabellenstruktur: halten Sie es einfach. Es scheint, als gäbe es eine niedrige, feste Anzahl von Sprachen. Sie könnten nur eine Spalte für jede Sprache dann haben:

CREATE TABLE txt (
    txt_id serial PRIMARY KEY 
,txt text NOT NULL -- master language NOT NULL? 
,txt_fr text -- others can be NULL? 
,txt_es text 
,txt_de text 
); 

Dies ist ziemlich effektiv, auch mit vielen Sprachen. NULL storage is very cheap.
Wenn Sie eine unterschiedliche Anzahl von Sprachen verwenden, ist eine separate Tabelle möglicherweise die bessere Lösung. Diese Lösung setzt voraus, dass Sie eine „Mastersprache“ haben, wo die Zeichenfolge ist immer vorhanden:

CREATE TABLE txt (
    txt_id serial PRIMARY KEY 
,txt text NOT NULL -- master language NOT NULL? 
); 

CREATE TABLE lang (
    lang_abbr text PRIMARY KEY -- de, es, fr, ... 
,lang  text NOT NULL 
,note  text 
); 

Oder, wenn eine (zwei Buchstaben) Abkürzung genug ist, erstellen Sie einfach ein enum type die Sprache zu identifizieren.

CREATE TABLE txt_trans (
    txt_id int REFERENCES txt(txt_id) ON UPDATE CASCADE ON DELETE CASCADE 
,lang_abbr text REFERENCES lang(lang_abbr) ON UPDATE CASCADE 
,txt  text NOT NULL -- master language NOT NULL? 
,CONSTRAINT txt_trans_pkey PRIMARY KEY (txt_id, lang_abbr) 
); 

Nicht Behandlung der Mastersprache besondere und halten alle Sprachvarianten in der gleichen Tabelle könnte einfacher in Ihrer Anwendung machen Handhabung. Aber es hängt wirklich von Ihren Anforderungen ab.

+0

Was denken Sie über die Verwendung des JSON-Datentyps zum Speichern der zusätzlichen Werte, die mit dem Gebietsschemacode eingegeben werden? –

+0

@ JeremyBaker: Der Datentyp 'json' ist eine gute Lösung für einen großen Pool von möglicherweise variierenden Attributen. Nicht so sehr für eine Hand voller bekannter Attribute (wie in diesem Beispiel). Es hängt vom Gesamtbild ab. Als diese Frage gestellt wurde, hatte Postgres 9.2 eine sehr einfache Unterstützung von json. Die Dinge haben sich seither sehr verbessert, nicht zuletzt durch das Hinzufügen von 'jsonb' ... –