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)
.
我不得不在问卷数据库中处理这个问题.多个问卷需要翻译成多种语言(英语,日语,中文).
我们首先确定了将在问卷上打印出来的所有文本列.对于所有这些,我们需要能够存储翻译.对于需要翻译各有表中的文本列,我们再创建一个_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)
正如您所看到的,基本上这类似于实体属性值设计,这使得查询很麻烦.
最后一种方法的另一个问题是,如果不是不可能的话,对翻译文本强制执行约束(在我们的例子中主要是单一性约束)会很困难.通过单独的翻译表,您可以轻松,干净地克服这些问题.