Berikut adalah cara saya mendesain database:
Visualisasi oleh DB Designer Fork
i18n
tabel hanya berisi PK, sehingga tabel apa pun hanya perlu merujuk PK ini untuk menginternasionalkan bidang. Tabel translation
kemudian bertanggung jawab untuk menautkan ID umum ini dengan daftar terjemahan yang benar.
locale.id_locale
adalah VARCHAR(5)
untuk mengelola keduanya en
dan en_US
Sintaks ISO
.
currency.id_currency
adalah CHAR(3)
untuk mengelola sintaks ISO 4217
.
Anda dapat menemukan dua contoh:page
dan newsletter
. Keduanya dikelola admin entitas perlu menginternasionalkan bidangnya, masing-masing title/description
dan subject/content
.
Berikut ini contoh kueri:
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
Perhatikan bahwa ini adalah model data yang dinormalisasi. Jika Anda memiliki kumpulan data yang besar, mungkin Anda dapat memikirkan mendenormalisasinya untuk mengoptimalkan kueri Anda. Anda juga dapat bermain dengan indeks untuk meningkatkan kinerja kueri (dalam beberapa DB, kunci asing diindeks secara otomatis, mis. MySQL/InnoDB ).