Подтвердить что ты не робот

Проектирование схемы локализованной базы данных

Возможный дубликат:
Схема для многоязычной базы данных

Я работаю над веб-приложением, которое планирую сделать доступным на нескольких языках. Когда я создаю базу данных, я перехожу назад и вперед между двумя разными способами хранения локализованных описаний и еще чего-то в базе данных.

Первый вариант - это известная опция 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.

Поскольку я никогда раньше не видел такой дизайн, я предполагаю, что мне что-то не хватает. Любые веские причины не создавать его таким образом? Или, может быть, есть лучший вариант, о котором я не думал?

4b9b3361

Ответ 1

Я сначала скажу, что раньше я не занимался локализацией, так что это действительно мое мнение и не основано на опыте.

Мне нравится ваш второй вариант. Что касается базы данных БД, ее данные и способ доступа/обработки данных. В этом случае все данные есть, и вы будете в основном читать его и иметь хороший способ добраться до него. Вы можете ответить на одну и ту же проблему в обоих сценариях. Я бы предпочел второй вариант сам, потому что он сводит сумасшедшие таблицы повсюду. Вы поддерживаете таблицу для конкретной цели перевода. Вы можете повторно использовать его (не создавая больше таблиц только для обновлений позже), и он поддерживает целостность. Вы можете даже повторно использовать имена, если это имеет смысл где-то. Как если бы у вас была "Mantequilla" как категория и как любимая где-то в другом месте.

Мне нравится размещать связанные данные в одной таблице, когда это возможно, и не иметь данных, связанных с "переводом" в нескольких местах.

Единственное место, где это может быть неудачно, - это то, что у вас есть не просто имя и описание для чего-то, что требует перевода. Возможно, у вас есть имя, описание, код, магическое слово, глупый псевдоним и т.д. Для элемента. Хотя вы можете обойти это, добавив больше NameTokens в эту соответствующую таблицу и повторно используя имя, но это немного взломан.

Просто убедитесь, что модель соответствует вашим потребностям всем, и она должна работать нормально. Вы всегда можете добавить специальную таблицу перевода, если потребуется позже для конкретной таблицы. Это не будет отличаться от создания большого количества таблиц, хотя гибридное решение может ввести в заблуждение. Лучше всего найти один способ и попытаться придерживаться его.

Ответ 2

Есть дополнительный вариант, и я думаю, что я буду держать пари на этом!

  • Отделать базу данных полностью!

ПРИЧИНЫ (ПРОФИ):

  • Pyhsically seperated localized database
  • Леса (сформированные слои презентаций)
  • Easy Orm

МИНУСЫ:

  • Вам необходимо решить проблему UniqueId (репликация)
  • Вам необходимо синхронизировать данные схемы и нелокализации