我需要创建一个高度本地化的数据库.对于几乎所有实体,我需要翻译成5种语言.一些实体甚至需要和其他资源本地化(就像我作为路径输入的图像).
现在的问题是:
1:LOOKUP TABLE PER ENTITY / TABLE(有点臃肿的架构?)
我应该为每个表创建一个“本地化”本地化查找表,我需要本地化的值(并使用标准的int / bigint PKs作为元素)
像这儿:
MYITEMS ------- - MyItemId BIGINT PK - MyItemPrice DECIMAL MYITEMLOCALIZED --------------- - CPK_MyItemId BIGINT FK - CPK_LanguageCode NCHAR - LocalizedName NVARCHAR - LocalizedResourcePath NVARCHAR CUSTOMERS --------- - CustomerId BIGINT PK - CustomerName NVARCHAR CUSTOMERLOCALIZED --------------- - CPK_CustomerId BIGINT FK - CPK_LanguageCode NCHAR - LocalizedName NVARCHAR - LocalizedResourcePath NVARCHAR
要么
2:具有单个查找本地化表的GUID(重型guid用法?)
我应该使用GUID作为PK,然后只使用一个名称和一个资源本地化表.
MYITEMS ------- - MyItemId uniqueidentifier PK - MyItemPrice DECIMAL CUSTOMERS --------- - CustomerId uniqueidentifier PK - CustomerName NVARCHAR LOCALIZED --------------- - CPK_ElementGuid uniqueidentifier FK - CPK_LanguageCode NCHAR - LocalizedValue NVARCHAR - LocalizedResourcePath NVARCHAR
3:单一查看,但仅限于本地化(两个世界中最好的?)
我应该使用普通的int / bigint PK,然后为我需要本地化的每个列添加GUID列,并将本地化值存储到单个本地化查找表中.
MYITEMS ------- - MyItemId BIGINT PK - MyItemPrice DECIMAL - ItemNameLocalizationGuid uniqueidentifier(GUID) - ItemPictureLocalizationGuid uniqueidentifier(GUID) CUSTOMERS --------- - CustomerId BIGINT PK - CustomerName NVARCHAR - CustomeerNameLocalizationGuid uniqueidentifier(GUID) LOCALIZED --------------- - CPK_ElementGuid uniqueidentifier FK - CPK_LanguageCode NCHAR - LocalizedValue NVARCHAR
4:查看本地化ID的LOOKUP表(来回走动?)
我应该创建没有guid的表,但是将本地化ID存储在母表中?
像这儿:
MYITEMS ------- - MyItemId BIGINT PK - MyItemPrice DECIMAL - MyItemNameLocalizedId BIGINT CUSTOMERS --------- - CustomerId BIGINT PK - CustomerName NVARCHAR - CustomerGenderLocalizedId BIGINT LOCALIZED --------------- - LocalizationId BIGINT PK - CustomerId BIGINT FK - LanguageCode NCHAR - LocalizedName NVARCHAR - LocalizedResourcePath NVARCHAR
如果我使用GUID作为PK我已经阅读过我会遭受巨大的性能和数据大小的损失,但我也会立即处理跨服务器的元素唯一性,dbs ……
解决方法
首先,我强烈建议使用现有的本地化标识符标准 – 不要重新发明另一个系统!使用ISO-639标准代码语言,例如英语中的“en”,法语中的“fr”等.
其次,根据我的经验和判断,我会使用每个实体的语言表.
我们通常在主表上有一些“系统名称”,例如英文文本,然后我们有一个表“(实体)_TX”用于各种语言的文本表示.
像这样的东西:
TABLE CustomerType CustomerTypeID INT IDENTITY(1,1) PK CustomerTypeName VARCHAR(100) -- English "system" name,e.g. "Gold customer" TABLE CustomerType_TX CustomerTypeID INT LanguageID CHAR(2) -- ISO-639 codes CustomerTypeText VARCHAR(200) -- translated texts
对我来说,这比使用单一的基于GUID的编码方案更清晰,更明确,更“直观”.