Ето как бих проектирал базата данни:
Визуализация от DB Designer Fork
i18n
таблицата съдържа само PK, така че всяка таблица просто трябва да препраща към този PK, за да интернационализира поле. Таблицата translation
след това отговаря за свързването на този общ идентификатор с правилния списък с преводи.
locale.id_locale
е VARCHAR(5)
да управлявате и двете en
и en_US
ISO синтаксис
.
currency.id_currency
е CHAR(3)
за управление на синтаксиса на ISO 4217
.
Можете да намерите два примера:page
и newsletter
. И двете управлявани от администратор лицата трябва да интернационализират своите полета, съответно title/description
и subject/content
.
Ето примерна заявка:
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
Имайте предвид, че това е нормализиран модел на данни. Ако имате огромен набор от данни, може би бихте могли да помислите за денормализирането му за да оптимизирате вашите заявки. Можете също така да играете с индекси, за да подобрите производителността на заявките (в някои DB външните ключове се индексират автоматично, напр. MySQL/InnoDB ).