我需要为多语言的 Web 应用程序创建一个大规模的 DB 模型。
我每次思考如何做到这一点时都有一个疑问,那就是如何解决一个字段的多个翻译问题。一个案例。
管理员可以从后端编辑的语言级别表可以有多个项目,例如:基本、高级、流利、重要...在不久的将来可能会增加一种类型。管理员去后端添加一个新级别,它会在正确的位置对其进行排序.. 但是我如何处理最终用户的所有翻译?
数据库国际化的另一个问题是,用户研究可能会因美国、英国和德国而异……在每个国家/地区,他们都会有自己的水平(可能与另一个国家等价,但最终不同)。那么计费呢?
您如何进行大规模建模?
最佳答案
这是我设计数据库的方式:
DB Designer Fork 的可视化
i18n
表只包含一个 PK,因此任何表只需要引用这个 PK 来国际化一个字段。然后,translation
表负责将此通用 ID 与正确的翻译列表相关联。
locale.id_locale
是一个 VARCHAR(5)
来管理 en
和 en_US
ISO syntaxes .
currency.id_currency
是一个 CHAR(3)
来管理 ISO 4217 syntax .
您可以找到两个示例:page
和 newsletter
。这两个 admin-managed 实体都需要国际化他们的字段,分别是 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
请注意,这是一个规范化的数据模型。如果你有一个庞大的数据集,也许你可以考虑 denormalizing it优化您的查询。您还可以使用索引来提高查询性能(在某些数据库中,外键会自动建立索引,例如 MySQL/InnoDB )。
关于mysql - 用于国际和多语言目的的数据库建模,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10693508/