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

ude*_*ter 34 mysql database multilingual database-design internationalization

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

我每次想到如何做到这一点的一个疑问是我如何解决一个字段的多个翻译.一个案例.

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

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

你如何大规模地模拟这个?

sp0*_*00m 55

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

数据模型

DB Designer Fork可视化

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

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

currency.id_currency是一个CHAR(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
Run Code Online (Sandbox Code Playgroud)

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

  • 不要混合**货币**和**翻译**. (6认同)

egg*_*yal 31

以前关于此主题的一些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. 数据库国际化的另一个问题是,用户研究可能会有所不同,从美国到英国到德国......在每个国家,他们都有自己的水平(可能它会相当于另一个但最终不同).计费怎么样?

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