这是数据库中多语言数据的正确方法吗?

时间:2013-04-14 17:40:31

标签: database database-design translation multilingual

我目前正在开发一个网站,其中某些动态数据必须以各种语言提供。现在的语言有三种,但想法是在未来增加更多。

想象一下这第一个场景,你有一个页面,并希望以三种不同的语言提供内容。我的数据库中的页面存储如下:

Pages UML

这很有用,因为对于我所拥有的每种语言,我都会为这些页面创建一个新的翻译内容。

但是,随着项目的进展,我发现了更多需要翻译数据的情况。下图是具有类型,子类型和状态的产品的示例。所有这些数据必须以所有不同的语言提供。

Products UML

这不是有点矫枉过正,因为我最终会拿着只持有ID的表格吗?对于需要保存翻译内容的每个表格,我需要一个新表格。

有没有更好的方法?

2 个答案:

答案 0 :(得分:2)

如果你愿意牺牲一些外键和“数据库纯度”,你可以这样做:

CREATE TABLE LocalizedTexts(OwnerType byte PK, OwnerID int PK, LanguageID int PK, Text string)

对于每个“所有者”(Products,StatusNames,Types,...),您可以指定一个整数常量OwnerType。在LocalizedTexts中,您的主键包含所有者类型,所有者ID(例如ProductIDStatusNameIDTypeID,...)和语言ID。< / p> 如果OwnerType不唯一(因为它来自多个表),则

OwnerID消除歧义。

这是一个很好的可扩展和规范化的架构。唯一的缺点是你不能在这里拥有FK。

答案 1 :(得分:1)

我认为这取决于您是否需要对新语言采用“动态”方法,或者您基本上知道应用需要支持多少种语言。

我们只有每种语言的专栏:

Create table Product (int id, text name_de, text name_en, etc... )

但这意味着,如果添加新语言,则必须稍微更改数据库架构。 但是编程简单,查找速度快。

此解决方案与@ usr之间的区别在于,在他的解决方案中,您可以在不更改数据库的情况下添加语言。每次添加新语言时,我的解决方案都需要架构更新。例如。瑞士的大多数公司都有他们的网站3种,也许是4种语言,他们就是这样。所以,这个解决方案有效。但如果你不断添加语言,那就有点复杂了。