Đây là cách tôi thiết kế cơ sở dữ liệu:
Trực quan hóa bởi DB Designer Fork
i18n
bảng chỉ chứa một PK, vì vậy bất kỳ bảng nào cũng phải tham chiếu PK này để quốc tế hóa một trường. Bảng translation
sau đó chịu trách nhiệm liên kết ID chung này với danh sách bản dịch chính xác.
locale.id_locale
là một VARCHAR(5)
để quản lý cả hai en
và en_US
cú pháp ISO
.
currency.id_currency
là một CHAR(3)
để quản lý cú pháp ISO 4217
.
Bạn có thể tìm thấy hai ví dụ:page
và newsletter
. Cả hai thứ này do quản trị viên quản lý entites cần quốc tế hóa các trường của chúng, tương ứng là title/description
và subject/content
.
Đây là một truy vấn mẫu:
select
t_subject.tx_translation as subject,
t_content.tx_translation as content
from newsletter n
-- join for subject
inner join translation t_subject
on t_subject.id_i18n = n.i18n_subject
-- join for content
inner join translation t_content
on t_content.id_i18n = n.i18n_content
inner join locale l
-- condition for subject
on l.id_locale = t_subject.id_locale
-- condition for content
and l.id_locale = t_content.id_locale
-- locale condition
where l.id_locale = 'en_GB'
-- other conditions
and n.id_newsletter = 1
Lưu ý rằng đây là mô hình dữ liệu chuẩn hóa. Nếu bạn có một tập dữ liệu khổng lồ, có thể bạn có thể nghĩ đến việc không chuẩn hóa nó để tối ưu hóa các truy vấn của bạn. Bạn cũng có thể sử dụng các chỉ mục để cải thiện hiệu suất truy vấn (trong một số DB, khóa ngoại được lập chỉ mục tự động, ví dụ: MySQL / InnoDB ).