Sørg først for, at databasens landestandard
kan beskæftige sig med forskellige sprog. Brug en UTF-8 server-kodning. Indstil eventuelt LC_COLLATE = 'C'
at være på neutral grund eller bruge en sortering for at dit første sprog har en standard sorteringsrækkefølge. Start med at læse kapitlet Sorteringssupport
i manualen.
Jeg vil kraftigt anbefale, at du bruger den seneste version af PostgreSQL (9.1 i skrivende stund), fordi den har overlegen sorteringsunderstøttelse.
Hvad angår tabelstrukturen :hold det simpelt. Det lyder som om, at der er et lavt, fast antal sprog at beskæftige sig med. Du kunne bare have en kolonne for hvert sprog så:
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
);
Dette er ret effektivt, selv med mange sprog. NULL-lagring er meget billig.
Hvis du har et varierende antal sprog at håndtere, kan en separat tabel være den bedre løsning. Denne løsning forudsætter, at du har et "mastersprog", hvor strengen altid er til stede:
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
);
Eller, hvis en (to-bogstavs) forkortelse er nok, skal du bare oprette en enum
type
for at identificere sproget.
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)
);
Ikke At behandle mastersproget specielt og holde alle sprogvarianter i samme tabel kan gøre håndteringen i din app lettere. Men det afhænger virkelig af dine krav.