Najpierw upewnij się, że lokalizacja bazy danych
radzi sobie z różnymi językami. Użyj kodowania serwera UTF-8. Opcjonalnie ustaw LC_COLLATE = 'C'
być na neutralnym gruncie lub użyć sortowania dla swojego pierwszego języka, aby mieć domyślną kolejność sortowania. Zacznij od przeczytania rozdziału Obsługa sortowania
w instrukcji.
Gorąco sugeruję, abyś używał najnowszej wersji PostgreSQL (w momencie pisania 9.1), ponieważ ma lepszą obsługę sortowania.
Jeśli chodzi o strukturę tabeli :nie komplikuj. Wygląda na to, że istnieje mała, stała liczba języków, z którymi trzeba się uporać. Możesz wtedy mieć po prostu kolumnę dla każdego języka:
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
);
Jest to całkiem skuteczne, nawet w wielu językach. Pamięć o wartości NULL jest bardzo tania.
Jeśli masz do czynienia z różną liczbą języków, lepszym rozwiązaniem może być oddzielna tabela. To rozwiązanie zakłada, że masz „język główny”, w którym ciąg jest zawsze obecny:
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
);
Lub, jeśli wystarczy (dwuliterowy) skrót, po prostu utwórz enum
wpisz
aby zidentyfikować język.
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)
);
Nie traktowanie języka głównego jako specjalnego i utrzymywanie wszystkich wariantów języka w tej samej tabeli może uprościć obsługę w Twojej aplikacji. Ale to naprawdę zależy od Twoich wymagań.