Zde je způsob, jakým bych navrhl databázi:
Vizualizace od DB Designer Fork
i18n
tabulka obsahuje pouze PK, takže každá tabulka musí k internacionalizaci pole pouze odkazovat na tento PK. Tabulka translation
má potom na starosti propojení tohoto obecného ID se správným seznamem překladů.
locale.id_locale
je VARCHAR(5)
pro správu obou en
a en_US
Syntaxe ISO
.
currency.id_currency
je CHAR(3)
ke správě syntaxe ISO 4217
.
Můžete najít dva příklady:page
a newsletter
. Obě tyto položky jsou spravovány správcem entity potřebují internacionalizovat svá pole, respektive title/description
a subject/content
.
Zde je příklad dotazu:
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
Všimněte si, že se jedná o normalizovaný datový model. Pokud máte obrovskou datovou sadu, možná byste mohli přemýšlet o denormalizaci pro optimalizaci vašich dotazů. Můžete si také pohrát s indexy, abyste zlepšili výkon dotazů (v některých DB jsou cizí klíče indexovány automaticky, např. MySQL/InnoDB ).