我需要为将是多语言的Web应用程序创建大型DB模型。
我每次都在思考如何做到这一点时,一个疑问就是我如何解决一个字段的多个翻译问题。一个案例。
管理员可以从后端编辑的语言级别表可以有多个项目,例如:基本,高级,流利,重要…在不久的将来,它将是另一种类型。管理员转到后端并添加一个新级别,它将在正确的位置进行排序。.但是,我如何为最终用户处理所有翻译?
数据库国际化的另一个问题是,对于用户研究而言,从美国到英国再到德国,可能有所不同…在每个国家中,他们都有自己的水平(可能等同于另一个,但最终是不同的)。那计费呢?
您如何大规模建模?
这是我设计数据库的方式:
通过 DB Designer Fork进行可视化
该i18n表仅包含一个PK,因此任何表都只需引用该PK即可国际化字段。translation然后,该表负责将此通用ID与正确的翻译列表链接。
i18n
translation
locale.id_locale是VARCHAR(5)同时管理en和en_US ISO语法的。
locale.id_locale
VARCHAR(5)
en
en_US
currency.id_currency是CHAR(3)管理ISO 4217语法的一个。
currency.id_currency
CHAR(3)
您可以找到两个示例:page和newsletter。这两种的 管理员管理 的entites分别需要国际化的田地,title/description和subject/content。
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)。