Я должен сделать базу данных, которая высоко локализуется. Почти для всех объектов мне нужен перевод в 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
или
если я использую 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
если я использую нормальный 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
я должен составить таблицы без гуидов, но идентификатор локализации хранилища в родительской таблице?
Как здесь:
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 в качестве PKs, я читал, я перенесу огромную производительность и штраф размера данных, но я буду также немедленно иметь дело с уникальностью элемента через серверы, dbs...
Прежде всего, я настоятельно рекомендую использовать существующий стандарт для идентификаторов локализации - не изобретайте заново еще одну систему! Используйте стандартные коды ISO-639 для языка, например «en» для английского, «fr» для французского и т. д.
См. Википедию для списка всех определенных кодов.
Во-вторых, по моему опыту и моему мнению, я бы использовал языковую таблицу для каждой сущности.
Обычно у нас есть какое-то "название системы" в основной таблице, например английский текст, а затем у нас есть таблица "(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
На мой взгляд, это более четко, ясно и «интуитивно», чем использование единой схемы кодирования на основе GUID.