47

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

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

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

数据库国际化的另一个问题是,用户研究可能会因美国、英国和德国而异……在每个国家,他们都会有自己的水平(可能与另一个国家等价,但最终不同)。那么计费呢?

你是如何大规模建模的?

4

2 回答 2

70

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

数据模型

DB Designer Fork的可视化

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

locale.id_locale是一个VARCHAR(5)管理enen_US ISO 语法

currency.id_currency是一种CHAR(3)管理ISO 4217 的语法

您可以找到两个示例:pagenewsletter。这两个由管理员管理的实体都需要分别国际化他们的领域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)。

于 2012-05-24T09:18:07.460 回答
40

以前关于此主题的一些 StackOverflow 问题:

一些有用的外部资源:

最好的方法通常是为每个现有表格创建一个新表格,将文本项移入其中;新表的PK是旧表的PK加上语言。

在你的情况下:

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

您现有的表可能看起来像这样:

+----+--------+---------+
| 编号 | 价格 | 类型 |
+----+--------+---------+
| 1 | 299 | 基本 |
| 2 | 299 | 提前|
| 3 | 399 | 流利 |
| 4 | 0 | 物质 |
+----+--------+---------+

然后它变成两个表:

+----+-------+ +----+------+-------------+
| 编号 | 价格 | | 编号 | 朗 | 类型 |
+----+-------+ +----+------+-------------+
| 1 | 299 | | 1 | zh | 基本 |
| 2 | 299 | | 2 | zh | 提前|
| 3 | 399 | | 3 | zh | 流利 |
| 4 | 0 | | 4 | zh | 物质 |
+----+-------+ | 1 | 法语 | 元素 |
                 | 2 | 法语 | 前卫 |
                 | 3 | 法语 | 钱|
                 : : : :
                 +----+------+-------------+
  1. 数据库国际化的另一个问题是,用户研究可能会因美国、英国和德国而异……在每个国家,他们都会有自己的水平(可能与另一个国家等价,但最终不同)。那么计费呢?

所有本地化都可以通过类似的方法进行。您可以移动任何可本地化的字段,而不只是将文本字段移动到新表中 - 只有所有语言环境共有的字段才会保留在原始表中。

于 2012-05-24T08:50:33.673 回答