Buz*_*bba 7 sql-server database-design localization guid
我需要创建一个高度本地化的数据库.对于几乎所有实体,我需要翻译成5种以上的语言.有些实体甚至需要本地化的附加资源(比如我作为路径输入的图像).
现在的问题是:
我应该为每个表创建一个"本地化"本地化查找表,我需要本地化的值(并使用标准的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
Run Code Online (Sandbox Code Playgroud)
要么
我应该使用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
Run Code Online (Sandbox Code Playgroud)
我应该使用普通的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
Run Code Online (Sandbox Code Playgroud)
我应该创建没有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
Run Code Online (Sandbox Code Playgroud)
如果我使用GUID作为PK我已经阅读过我会遭受巨大的性能和数据大小的损失,但我也会立即处理跨服务器的元素唯一性,dbs ......
mar*_*c_s 13
首先,我强烈建议使用现有的本地化标识符标准 - 不要重新发明另一个系统!使用ISO-639标准代码用于语言,例如"en"代表英语,"fr"代表法语等.
请参阅Wikipedia以获取所有已定义代码的列表.
其次,根据我的经验和判断,我会使用每个实体的语言表.
我们通常在主表上有一些"系统名称",例如英文文本,然后我们有一个表"(entity)_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
Run Code Online (Sandbox Code Playgroud)
对我来说,这比单一的基于GUID的编码方案更清晰,更明确,更"直观".
| 归档时间: |
|
| 查看次数: |
3828 次 |
| 最近记录: |