2

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

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

页面 UML

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

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

产品 UML

这是不是有点矫枉过正,因为我最终会得到只包含 ID 的表?对于需要保存翻译内容的每个表,我都需要一个新表。

有没有更好的方法?

4

2 回答 2

2

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

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

对于每个“所有者”(Products、StatusNames、Types,...),您分配一个整数常量OwnerType。您有一个主键,LocalizedTexts由所有者类型、所有者 ID(例如ProductIDor StatusNameIDor TypeID、...)和语言 ID 组成。

OwnerType消除歧义以防万一OwnerID不是唯一的(因为它来自多个表)。

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

于 2013-04-14T18:23:19.503 回答
1

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

我们对每种语言都有一个专栏:

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

但这意味着,如果您添加一种新语言,您必须稍微更改您的数据库架构。但是使编程变得简单并且查找速度很快。

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

于 2013-04-15T06:34:31.317 回答