用于国际和多语言目的的数据库建模
我需要为多语言的Web应用程序创建大型数据库模型。
每次我想如何做到这一点时,我都怀疑我是如何解决为一个领域进行多次翻译的。 一个案例。
管理员可以从后端编辑的语言级别表可以包含多个项目,如:basic,advance,fluent,mattern ...在不久的将来,它可能会是另一种类型。 管理员进入后端并添加一个新的级别,它会将其排序在正确的位置..但我如何处理最终用户的所有翻译?
数据库国际化的另一个问题是,用户研究可能会有所不同,从美国到英国到德国......在每个国家,他们将有他们的水平(这可能会相当于另一个,但最后,不同)。 那么结算呢?
你如何在一个大规模的模型?
这是我设计数据库的方式:
DB Designer Fork的可视化
i18n
表只包含一个PK,因此任何表只需引用此PK即可将字段国际化。 表格translation
然后负责将该通用ID与正确的翻译列表关联起来。
locale.id_locale
是一个VARCHAR(5)
来管理en
和en_US
ISO语法。
currency.id_currency
是用于管理ISO 4217语法的CHAR(3)
。
你可以找到两个例子: 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)。
关于此主题的一些以前的StackOverflow问题:
一些有用的外部资源:
最好的方法是,对于每个现有的表格,创建一个新的表格,将文本项目移动到该表格中; 新表的PK是旧表的PK和语言一起的。
在你的情况下:
管理员可以从后端编辑的语言级别表可以包含多个项目,如: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 | : : : : +----+------+-------------+
数据库国际化的另一个问题是,用户研究可能不同于美国,英国和德国......在每个国家,他们都有自己的水平(可能会相当于另一个国家,但最后会有所不同)。 那么结算呢?
所有本地化都可以通过类似的方法进行。 不仅仅是将文本字段移动到新表中,您可以移动任何可本地化的字段 - 只有那些对所有语言环境通用的字段才会保留在原始表中。
上一篇: Database modeling for international and multilingual purposes