一尘不染

用于国际和多语言目的的数据库建模

mysql

我需要为将是多语言的Web应用程序创建大型DB模型。

我每次都在思考如何做到这一点时,一个疑问就是我如何解决一个字段的多个翻译问题。一个案例。

管理员可以从后端编辑的语言级别表可以有多个项目,例如:基本,高级,流利,重要…在不久的将来,它将是另一种类型。管理员转到后端并添加一个新级别,它将在正确的位置进行排序。.但是,我如何为最终用户处理所有翻译?

数据库国际化的另一个问题是,对于用户研究而言,从美国到英国再到德国,可能有所不同…在每个国家中,他们都有自己的水平(可能等同于另一个,但最终是不同的)。那计费呢?

您如何大规模建模?


阅读 243

收藏
2020-05-17

共1个答案

一尘不染

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

资料模型

通过 DB Designer Fork进行可视化

i18n表仅包含一个PK,因此任何表都只需引用该PK即可国际化字段。translation然后,该表负责将此通用ID与正确的翻译列表链接。

locale.id_localeVARCHAR(5)同时管理enen_US
ISO语法的

currency.id_currencyCHAR(3)管理ISO
4217语法的一个

您可以找到两个示例:pagenewsletter。这两种的 管理员管理
的entites分别需要国际化的田地,title/descriptionsubject/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
)。

2020-05-17