Каков наилучший способ создания многоязычной базы данных? Чтобы создать локализованную таблицу для каждой таблицы, вы создаете конструкторский и запросный комплекс, в другом случае добавление столбца для каждого языка является простым, но не динамическим, пожалуйста, помогите мне понять, что лучше всего подходит для корпоративных приложений.
Каковы наилучшие методы разработки многоязыковой базы данных?
Ответ 1
Что мы делаем, это создать две таблицы для каждого многоязычного объекта.
например. первая таблица содержит только данные, не зависящие от языка (первичный ключ и т.д.), а вторая таблица содержит одну запись на каждый язык, содержащий локализованные данные, а также код ISO языка.
В некоторых случаях мы добавляем поле DefaultLanguage, чтобы мы могли вернуться на этот язык, если локализованные данные не доступны для указанного языка.
Пример:
Table "Product":
----------------
ID : int
<any other language-neutral fields>
Table "ProductTranslations"
---------------------------
ID : int (foreign key referencing the Product)
Language : varchar (e.g. "en-US", "de-CH")
IsDefault : bit
ProductDescription : nvarchar
<any other localized data>
При таком подходе вы можете обрабатывать столько языков, сколько необходимо (без необходимости добавлять дополнительные поля для каждого нового языка).
Обновление (2014-12-14): см. этот ответ, для получения дополнительной информации о реализации, используемой для загрузки многоязычных данных в приложение.
Ответ 2
Я считаю, что для меня этот тип подхода работает:
Product ProductDetail Country ========= ================== ========= ProductId ProductDetailId CountryId - etc - ProductId CountryName CountryId Language ProductName - etc - ProductDescription - etc -
В таблице ProductDetail содержатся все переводы (для названия продукта, описания и т.д.) на языках, которые вы хотите поддерживать. В зависимости от ваших требований к приложениям вы, возможно, захотите сломать таблицу Country, чтобы использовать региональные языки.
Ответ 3
Я рекомендую ответ, отправленный Мартином.
Но вы, похоже, беспокоитесь о том, что ваши запросы становятся слишком сложными:
Для создания локализованной таблицы для каждой таблицы выполняется проектирование и запрос сложного...
Итак, вы можете подумать, что вместо написания простых запросов вроде этого:
SELECT price, name, description FROM Products WHERE price < 100
... вам нужно будет начать писать такие запросы:
SELECT
p.price, pt.name, pt.description
FROM
Products p JOIN ProductTranslations pt
ON (p.id = pt.id AND pt.lang = "en")
WHERE
price < 100
Не очень красивая перспектива.
Но вместо того, чтобы делать это вручную, вы должны разработать свой собственный класс доступа к базе данных, который предварительно анализирует SQL, который содержит вашу специальную разметку локализации, и преобразует ее в фактический SQL, который вам нужно отправить в базу данных.
Использование этой системы может выглядеть примерно так:
db.setLocale("en");
db.query("SELECT p.price, _(p.name), _(p.description)
FROM _(Products p) WHERE price < 100");
И я уверен, что вы можете сделать еще лучше.
Ключ должен иметь одинаковые имена таблиц и полей.
Ответ 4
Я использую следующий подход:
Продукт
ProductID OrderID,...
ProductInfo
Название названия продукта LanguageID
Язык
LanguageID Название Культура,....
Ответ 5
Решение Martin очень похоже на мое, но как бы вы обрабатывали описания по умолчанию, когда нужный перевод не найден?
Для этого потребуется IFNULL() и другая инструкция SELECT для каждого поля?
Перевод по умолчанию будет храниться в той же таблице, где флаг, подобный "isDefault", указывает, что описание является описанием по умолчанию, если ни один не найден для текущего языка.