如何在DataBase Schema中支持多语言方法?

Wah*_*tar 9 database globalization database-design localization database-schema

我希望我的数据库支持其表中所有文本值的多语言.

那么这样做的最佳方法是什么?

EDIT1 ::

例如

我有这个"人"表:

ID int
FirstName  nvarchar(20)
LastName   nvarchar(20)
Notes      nvarchar(max)
BirthDate  date
...........
Run Code Online (Sandbox Code Playgroud)

所以,如果我希望我的程序支持新语言"让我说法语".

我应该在每次添加新语言时添加新列吗?所以我的"人"表看起来像这样

ID int
FirstName_en  nvarchar(20)
FirstName_fr  nvarchar(20)
LastName_en   nvarchar(20)
LastName_fr   nvarchar(20)
Notes_en      nvarchar(max)
Notes_fr      nvarchar(max)
BirthDate     date
...........
Run Code Online (Sandbox Code Playgroud)

或者我应该为语言添加2个新表,为"Person_Languages"值添加其他表?

所以这看起来像:" 语言 "表:

ID           int
Lang-symbol  nvarchar(4)
Run Code Online (Sandbox Code Playgroud)

" "表:

ID         int
BirthDate  Date
Run Code Online (Sandbox Code Playgroud)

最后是" Person_Translation "表:

LangID        int
PersonID      int
Translation   nvarchar(max)
Run Code Online (Sandbox Code Playgroud)

还是有更好的东西?

.

Rol*_*man 9

我不得不在问卷数据库中处理这个问题.多个问卷需要翻译成多种语言(英语,日语,中文).

我们首先确定了将在问卷上打印出来的所有文本列.对于所有这些,我们需要能够存储翻译.对于需要翻译各有表中的文本列,我们再创建一个_translations表,有一个外键指向原始表,一个外键,我们的语言表,然后主键Unicode列的每个文本字段这需要翻译.在这些文本列中,我们将存储我们需要的每种语言的翻译.

所以典型的查询看起来像:

select     p.id
,          pt.product_name
,          pt.product_description
from       product                  p
inner join product_translations pt
on         p.id = pt.product_id
and        'fr' = pt.language_code
Run Code Online (Sandbox Code Playgroud)

因此,总是只需要一个连接(对于每个表)来获得翻译.

我应该指出,我们只处理有限数量的表,因此维护一些额外的%_translations表并不是一个大问题.

我们确实考虑为新语言添加列,但出于多种原因决定反对它.首先,支持的语言数量尚不清楚,但可能是实质性的(10种,20种语言或更多).结合大多数表至少有3个不同的人类可读列的事实,我们必须添加许多很多文本列,这将导致非常宽的行.所以我们决定不这样做.

我们考虑制作一个大的"标签"表的另一种方法,包括列:

(table_name,id_of_table,column_name,language_id,translated_text)

有效地使用一个表来存储数据库中任何位置的所有翻译.我们决定针对过,因为它会变得复杂编写查询(每个"正常"的列将导致在转换表中的一行,这将导致multiuple倍有效地加入已经大转换表的普通表(每进行一次翻译专栏).对于你的示例表,你会得到这样的查询:

select     product.id 
,          product_name.translated_text product_name
,          product_description.translated_text product_description
from       product p
inner join translations product_name
on         p.id = product_name.id
and        'product'      = product_name.table_name
and        'product_name' = product_name.column_name
and        'fr'           = product_name.language
inner join translations product_description
on         p.id = product_name.id
and        'product'      = product_description.table_name
and        'product_description' = product_description.column_name
and        'fr'           = product_description.language
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,基本上这类似于实体属性值设计,这使得查询很麻烦.

最后一种方法的另一个问题是,如果不是不可能的话,对翻译文本强制执行约束(在我们的例子中主要是单一性约束)会很困难.通过单独的翻译表,您可以轻松,干净地克服这些问题.