Как оптимально организовать хранение сущностей в базе данных, если они содержат зависящие от (естественного) языка поля?
Допустим, у нас интернациональный интернет-магазин.
Это значит, что товары должны иметь заголовки и описания на всех языках, на которые таргетирован магазин. Класс ниже (представлен в UML) не удовлетворяет данному условию, так как имеет поля title
и description
непонятно для какого языка.
Кстати, я добавил цену просто чтобы не спрашивали "что это за такой товар без цены?", но в отличие от строковых полей работа с ценами другая: надо при отправке данных на клиент пересчитать цену на местную валюту по текущему курсу, добавить налоги и/или пошлины, если необходимо. В случае же с заголовком и описанием данные останутся неизменными до тех пор, пока их не отредактируют.
Каким же образом организовать хранение данных так, чтобы и производительность была хорошая, и чтобы поддерживать сервис было легче?
Поскольку хороший вопрос предполагает собственные предварительные изыскания, то изложу те подходы, которые знаю.
Подход 1: Отдельная колонка для каждого языка
При отправке данных на клиент нужно будет сделать выборку данных в соответствии с желаемым языком. Хорошо так же после получения данных из БД преобразовать зависящие от языка поля в поля с едиными именем:
Достоинства
- Минимальные потери производительности
Недостатки
- Трудно ориентироваться в таблице (уже с 4-5 языками).
Подход 2: Разнесение данных по дочерним таблицам
Звучит как "отношения между таблицами", но похоже, что это не так. Во всяком случае, это не отношение "один к одному", потому что на одну таблицу "products" будет несколько таблиц локализаций.
Основная таблица будет такой же, что и в предыдущем варианте:
Однако теперь под каждый язык будет такая дополнительная таблица:
В итоге, перед отправке данных на клиент нужно будет заполнить поля первой таблицы данными из второй. Вероятно, для снижения потерь в производительности можно использовать дополнительные базы данных, хранящие данные в виде ключ-значение наподобие Redis или DynamoDB.