Я приверженец следования концепции "реляционная база данных", поэтому в основном создаю таблицы (много таблиц).
Однако сейчас я наткнулся на такую задачу, которая заставила меня подумать в сторону нарушения нормальных форм и созданию json поля.
Вкрадце о задаче:
Необходимо реализовать мутьтиязычное приложение. Обычно я создаю таблицы:
- contents
- content_translations
- contents_images
- contents_image_translations
Часто их получается не много (ну скажем до 5 - 7). Однако сейчас есть задача портировать некую базу данных где есть GEO данные (Страны, Регионы, Города, Нас. пункты). Я пытался создавать 1 таблицу переводов, но тогда мы теряем возможность работы со внешними ключами и балуемся с полиморфическими связями. Это всего не большой пример, но таких несколько и таблиц с переводами получается очень много (а по сути они в себе хранят только id, relation_id, name).
Поэтому хочу попробовать поработать с JSON полем. В MySql 5.7 как раз есть такая возможность.
Структура поля примерно такая:
...
json_encode([
'ru' => ['locale' => 'ru', 'name' => $data['title_ru']],
'en' => ['locale' => 'en', 'name' => $data['title_en']],
]);
...
Выборка примерно такая:
SELECT
alias, translations,
JSON_UNQUOTE(json_extract(translations, '$.en.name')) AS like_name
FROM geo_countries
WHERE
JSON_UNQUOTE(json_extract(translations, '$.en.name')) LIKE '%Ukraine%'
OR
JSON_UNQUOTE(json_extract(translations, '$.ru.name')) LIKE '%Ukraine%';
Вопрос такой:
Кто работает с подобным подходом, есть ли профит, как себя показывает в продакшине ?