Trước tiên, hãy đảm bảo rằng ngôn ngữ cơ sở dữ liệu
có thể giao dịch với các ngôn ngữ khác nhau. Sử dụng mã hóa máy chủ UTF-8. Tùy chọn đặt LC_COLLATE = 'C'
trung lập hoặc sử dụng đối chiếu cho ngôn ngữ đầu tiên của bạn để có thứ tự sắp xếp mặc định. Bắt đầu bằng cách đọc chương Hỗ trợ đối chiếu
trong sách hướng dẫn.
Tôi thực sự khuyên bạn nên sử dụng phiên bản PostgreSQL mới nhất (9.1 tại thời điểm viết bài) vì nó có hỗ trợ đối chiếu vượt trội.
Đối với cấu trúc bảng :giữ cho nó đơn giản. Có vẻ như có một số lượng ngôn ngữ cố định thấp cần giải quyết. Sau đó, bạn chỉ có thể có một cột cho mỗi ngôn ngữ:
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
);
Điều này khá hiệu quả, ngay cả với nhiều ngôn ngữ. Bộ nhớ NULL rất rẻ.
Nếu bạn có nhiều ngôn ngữ khác nhau cần xử lý, một bảng riêng biệt có thể là giải pháp tốt hơn. Giải pháp này giả định rằng bạn có "ngôn ngữ chính", nơi chuỗi luôn hiện diện:
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
);
Hoặc, nếu viết tắt (hai chữ cái) là đủ, chỉ cần tạo enum
gõ
để xác định ngôn ngữ.
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)
);
Không coi ngôn ngữ chính là đặc biệt và giữ tất cả các biến thể ngôn ngữ trong cùng một bảng có thể giúp việc xử lý trong ứng dụng của bạn đơn giản hơn. Nhưng nó thực sự phụ thuộc vào yêu cầu của bạn.