Nejprve se ujistěte, že místo databáze
umí pracovat s různými jazyky. Použijte serverové kódování UTF-8. Volitelně nastavte LC_COLLATE = 'C'
být na neutrální půdě nebo použít řazení pro svůj první jazyk, aby bylo výchozí pořadí řazení. Začněte přečtením kapitoly Podpora shromažďování
v návodu.
Důrazně doporučuji, abyste používali nejnovější verzi PostgreSQL (9.1 v době psaní), protože má vynikající podporu řazení.
Pokud jde o strukturu tabulky :Udržujte to jednoduché. Zdá se, že existuje nízký, pevně stanovený počet jazyků, se kterými je třeba se vypořádat. Pak byste mohli mít sloupec pro každý jazyk:
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
);
To je docela efektivní, dokonce i v mnoha jazycích. NULL úložiště je velmi levné.
Pokud máte k dispozici různý počet jazyků, může být lepším řešením samostatná tabulka. Toto řešení předpokládá, že máte "master language", kde je řetězec vždy přítomen:
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
);
Nebo, pokud stačí (dvoupísmenná) zkratka, vytvořte enum
typ
k identifikaci jazyka.
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)
);
Ne speciální zpracování hlavního jazyka a ponechání všech jazykových variant ve stejné tabulce může usnadnit manipulaci ve vaší aplikaci. Ale opravdu záleží na vašich požadavcích.