Se först till att databasspråket
kan hantera olika språk. Använd en UTF-8-serverkodning. Ange eventuellt LC_COLLATE = 'C'
att vara på neutral mark eller använda en sortering för att ditt första språk ska ha en standardsortering. Börja med att läsa kapitlet Sorteringsstöd
i manualen.
Jag rekommenderar starkt att du använder den senaste versionen av PostgreSQL (9.1 i skrivande stund) eftersom den har överlägset stöd för sortering.
När det gäller tabellstrukturen :håll det enkelt. Det låter som att det finns ett lågt, fast antal språk att hantera. Du kan bara ha en kolumn för varje språk då:
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
);
Detta är ganska effektivt, även med många språk. NULL-lagring är väldigt billig.
Om du har ett varierande antal språk att hantera kan en separat tabell vara den bättre lösningen. Denna lösning förutsätter att du har ett "master language", där strängen alltid finns:
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, om en (tvåbokstavs) förkortning räcker, skapa bara en enum
typ
för att identifiera språket.
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)
);
Inte Att behandla masterspråket speciellt och behålla alla språkvarianter i samma tabell kan göra hanteringen i din app enklare. Men det beror verkligen på dina krav.