表格的语言翻译

时间:2012-12-13 16:21:09

标签: sql sql-server sql-server-2008

我知道大多数人使用下面的方法并为需要翻译的特定表创建转换表,但这可能相当于一堆表。

CREATE TABLE Product
(
     Product_id
    ,ProductTrans_id -- FK
)

CREATE TABLE ProductTranslation
(
     ProductTrans_id
    ,Product_id
    ,Name
    ,Descr
    ,lang_code
)

以下方法是否可行?假设您有许多表需要翻译多个列。你可以做以下nad将所有翻译保存在1个表中吗?我想这张桌子随着时间的推移会变得非常大。

   CREATE TABLE translation_entry (
          translation_id        int,
          language_id           int,
          table_name            nvarchar(200),
          table_column_name     nvarchar(200),
          table_row_id          bigint,
          translated_text       ntext
        )

    CREATE TABLE translation_language (
          id int,
          language_code CHAR(2)
        )   

所以使用第二种方法你会得到像这样的文本

select 
     product.name 
    ,translation_entry.translated_text
from product
inner join  translation_entry on product.product_id = translation_entry.table_row_id 
and translation_entry.table_name = 'Product' and translation_entry.table_column_name = 'Name'
and language_id = 3

1 个答案:

答案 0 :(得分:2)

我不确定你为什么担心表的数量:拥有更少的表并不意味着你的数据库更小,更高效或设计更好。特别是如果减少表的数量会增加查询的复杂性,我会非常小心这样做。

无论如何,我会为每个'base'表找一个转换表。主要原因是您的第二个解决方案不灵活:如果主键不是单个整数,则实现和使用变得极其困难。查询翻译也比较复杂,根据表格和数据的大小,可能难以有效地对其进行索引。

目前尚不清楚为什么TranslationID表上有Products;通常这种关系是相反的:

create table dbo.Products (
    ProductCode char(10) not null primary key,
    ProductName nvarchar(50) not null,
    ProductDescription nvarchar(100) not null,
    -- other columns
)

create table dbo.ProductsTranslations (
    ProductCode char(10) not null,
    LanguageCode char(2) not null,
    ProductName nvarchar(50) not null,
    ProductDescription nvarchar(100) not null,
    -- other translations
    constraint FK1 foreign key (ProductCode)
        references dbo.Products (ProductCode),
    constraint FK2 foreign key (LanguageCode)
        references dbo.Languages (LanguageCode),
    constraint PK primary key (ProductCode, LanguageCode)
)

根据您的工具集和部署过程,您可能希望直接从基础表生成转换表,作为数据库构建的一部分。您可以使用视图提供基本表的方便的“完全翻译”版本。

一个有趣的问题是Products中的列使用了什么语言,以及是否可以在不需要翻译时直接使用它们。我的建议是所有的生产代码都应该传递一个语言参数并只从ProductsTranslations表中获取文本,即使是英语(或者你的内部公司语言)。这样你可以确保在同一个表中找到所有“官方”名称,并且基表上的列是为了清晰和完整的数据模型以及开发人员的便利性和(可能)内部使用的ad hoc报告等等。