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

时间:2012-05-21 22:29:58

标签: mysql database database-design internationalization multilingual

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

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

管理员可以从后端编辑的语言级别表可以有多个项目,如:basic,advance,fluent,mattern ......在不久的将来,它可能会是另一种类型。管理员进入后端并添加一个新级别,它会将其排序在正确的位置..但我如何处理最终用户的所有翻译?

数据库国际化的另一个问题是,用户研究可能会有所不同,从美国到英国再到DE ......在每个国家,他们都有自己的水平(可能它会相当于另一个,但最终会有所不同)。还有账单呢?

您如何大规模地对此进行建模?

2 个答案:

答案 0 :(得分:54)

以下是我设计数据库的方法:

Data model

DB Designer Fork

可视化

i18n表仅包含PK,因此任何表都必须引用此PK以使字段国际化。然后,表translation负责将此通用ID与正确的翻译列表相关联。

locale.id_locale是一个VARCHAR(5)来管理enen_US ISO syntaxes

currency.id_currencyCHAR(3)来管理ISO 4217 syntax

您可以找到两个示例:pagenewsletter。这两个 admin-managed 都需要分别对其字段进行国际化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

请注意,这是一个规范化的数据模型。如果你有一个庞大的数据集,也许你可以考虑denormalizing it来优化你的查询。您还可以使用索引来提高查询性能(在某些数据库中,外键会自动编入索引,例如MySQL/InnoDB)。

答案 1 :(得分:29)

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

一些有用的外部资源:

最好的方法通常是,对于每个现有表,创建一个移动文本项的新表;新表的PK是旧表的PK和语言。

在你的情况下:

  1.   

    管理员可以从后端编辑的语言级别表可以有多个项目,如:basic,advance,fluent,mattern ......在不久的将来,它可能会是另一种类型。管理员进入后端并添加一个新级别,它会将其排序在正确的位置..但我如何处理最终用户的所有翻译?

    您现有的表格可能如下所示:

    +----+-------+---------+
    | id | price | type    |
    +----+-------+---------+
    |  1 |   299 | basic   |
    |  2 |   299 | advance |
    |  3 |   399 | fluent  |
    |  4 |     0 | mattern |
    +----+-------+---------+
    

    然后变成两个表:

    +----+-------+   +----+------+-------------+
    | id | price |   | id | lang | type        |
    +----+-------+   +----+------+-------------+
    |  1 |   299 |   |  1 | en   | basic       |
    |  2 |   299 |   |  2 | en   | advance     |
    |  3 |   399 |   |  3 | en   | fluent      |
    |  4 |     0 |   |  4 | en   | mattern     |
    +----+-------+   |  1 | fr   | élémentaire |
                     |  2 | fr   | avance      |
                     |  3 | fr   | couramment  |
                     :    :      :             :
                     +----+------+-------------+
    
  2.   

    数据库国际化的另一个问题是,用户研究可能会有所不同,从美国到英国再到DE ......在每个国家,他们都有自己的水平(可能它会相当于另一个,但最终会有所不同)。还有账单呢?

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