Pertama-tama pastikan bahwa lokal basis data
dapat menangani berbagai bahasa. Gunakan pengkodean server UTF-8. Secara opsional, atur LC_COLLATE = 'C'
berada di tempat netral atau menggunakan susunan untuk bahasa pertama Anda untuk memiliki urutan pengurutan default. Mulailah dengan membaca bab Dukungan Pengumpulan
dalam manual.
Saya sangat menyarankan agar Anda menggunakan PostgreSQL versi terbaru (9.1 pada saat penulisan) karena memiliki dukungan pemeriksaan yang unggul.
Adapun struktur tabel :tetap sederhana. Sepertinya ada sedikit bahasa yang harus ditangani. Anda cukup memiliki kolom untuk setiap bahasa:
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
);
Ini cukup efektif, bahkan dengan banyak bahasa. Penyimpanan NULL sangat murah.
Jika Anda memiliki sejumlah bahasa yang berbeda untuk ditangani, tabel terpisah mungkin merupakan solusi yang lebih baik. Solusi ini mengasumsikan bahwa Anda memiliki "bahasa master", di mana string selalu ada:
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
);
Atau, jika singkatan (dua huruf) sudah cukup, buat saja enum
ketik
untuk mengidentifikasi bahasa.
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)
);
Tidak memperlakukan bahasa master khusus dan menyimpan semua varian bahasa dalam tabel yang sama dapat membuat penanganan di aplikasi Anda menjadi lebih sederhana. Tapi itu sangat tergantung pada kebutuhan Anda.