Sql server 在SQL Server中使用GUID或。。。?

Sql server 在SQL Server中使用GUID或。。。?,sql-server,database-design,localization,guid,Sql Server,Database Design,Localization,Guid,我需要建立一个高度本地化的数据库。对于几乎所有的实体,我都需要翻译成5种以上的语言。有些实体甚至需要本地化和附加资源(如我作为路径输入的图像) 现在的问题是: 1:每个实体/表的查找表(有点臃肿的模式?) 我是否应该为每个需要本地化值的表创建一个“本地化”本地化查找表(并对元素使用标准int/bigint PKs) 就像这里: MYITEMS ------- - MyItemId BIGINT PK - MyItemPrice DECIMAL MYITEMLOCALIZED -------

我需要建立一个高度本地化的数据库。对于几乎所有的实体,我都需要翻译成5种以上的语言。有些实体甚至需要本地化和附加资源(如我作为路径输入的图像)

现在的问题是:

1:每个实体/表的查找表(有点臃肿的模式?) 我是否应该为每个需要本地化值的表创建一个“本地化”本地化查找表(并对元素使用标准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
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

2:具有单个查找本地化表的guid(大量使用guid?) 我应该使用guid作为PKs,然后只使用一个名称和一个资源本地化表吗

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:单一查找,但GUI仅用于本地化(两个世界中的最佳?) 我应该使用普通的int/bigint PKs,然后为每个需要本地化的列添加一个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的查找表(来回?) 我应该创建没有guid的表,但将本地化id存储在母表中吗

就像这里:

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
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


如果我使用我读过的GUI作为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的编码方案更清晰、更明确、更“直观”。

这实际上是我的选择。嗯,像en-gb和en-us这样的标准代码比char(2)稍微多了一点,所以在这种情况下,我必须扩大一点:)请记住,guid也不能保证是唯一的……尽管你很可能会看到重复的,但仍然…@BuzzBubba:是的,如果你需要区分像这样的区域化语言的话“欧洲国家”对“欧洲国家”对“欧洲国家”,那么是的,您还需要一些字符。但是——如果可能的话,我还是会使用标准代码——没有必要为已经解决的问题再发明一组常量:-)CustomerType_TX.CustomerTypeText不需要是nvarchar吗?@aloneguid:对于任何类型和数量的语言,可能都会很痛苦——但至少会起作用。在我看来,任何其他方法通常只限于2、3或5种语言——如果您需要更多语言,您就会陷入困境——这不是一个好的设计。是的,使用单独的TX表需要更多的工作-但是,如果你想要一个好的系统-这是一项艰苦的工作,没有人说这将是一顿免费的午餐!