Возможный дубликат:
Схема для многоязычной базы данных
Я работаю над веб-приложением, которое планирую сделать доступным на нескольких языках. Когда я создаю базу данных, я перехожу назад и вперед между двумя разными способами хранения локализованных описаний и еще чего-то в базе данных.
Первый вариант - это известная опция table_name, table_name_ml:
TABLE Category (
ID int,
ParentID int,
Name varchar(50),
Description varchar(255)
)
TABLE Category_ML (
ID int,
CategoryID int,
LocaleID int,
Name varchar(50),
Description varchar(255)
)
Второй вариант заключается в том, чтобы не хранить текст в базовых таблицах вообще, а вместо этого хранить токен, который можно было бы использовать для поиска фактического локализованного текста в другом месте, например:
TABLE Category (
ID int,
ParentID int,
NameToken varchar(50),
DescriptionToken varchar(50),
)
// Tables in a separate content management type system
TABLE Content (
ID int,
Token varchar(50)
)
TABLE Translation (
ID int
ContentID int,
LocaleID int,
Value text
)
Идея здесь в том, что таблицы Content и Translation будут содержать локализованный текст для многих разных объектов в базе данных. Сервисный уровень будет возвращать базовые объекты только с помощью токенов, и уровень представления будет искать фактические текстовые значения, используя таблицы Content/Translation, которые будут сильно кэшированы. Таблицы Content/Translation также будут использоваться для хранения другого контента типа CMS (статический текст на веб-страницах и т.д.).
Мне нравится первый вариант, потому что он пробовал и правда, но второй вариант, похоже, имеет много других преимуществ:
- Весь мой текст/локализованный контент находится в одном месте (упрощает перевод).
- Уровень сервиса действительно не нужно заботиться о локалях.
- Упрощает запросы, не присоединяясь к кучу таблиц типов ML.
Поскольку я никогда раньше не видел такой дизайн, я предполагаю, что мне что-то не хватает. Любые веские причины не создавать его таким образом? Или, может быть, есть лучший вариант, о котором я не думал?