这是我设计数据库的方式:

DB Designer Fork的可视化
该i18n表仅包含一个 PK,因此任何表只需引用此 PK 即可将字段国际化。然后该表translation负责将这个通用 ID 与正确的翻译列表联系起来。
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
请注意,这是一个规范化的数据模型。如果您有一个庞大的数据集,也许您可以考虑对其进行非规范化以优化您的查询。您还可以使用索引来提高查询性能(在某些数据库中,外键会自动建立索引,例如MySQL/InnoDB)。