Задать вопрос

Хорошая ли идея хранить переводы в JSON?

Я приверженец следования концепции "реляционная база данных", поэтому в основном создаю таблицы (много таблиц).
Однако сейчас я наткнулся на такую задачу, которая заставила меня подумать в сторону нарушения нормальных форм и созданию 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%';


Вопрос такой:
Кто работает с подобным подходом, есть ли профит, как себя показывает в продакшине ?
  • Вопрос задан
  • 988 просмотров
Подписаться 4 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 4
sim3x
@sim3x
Как уже сказали, перевод темплейтов - в файлах

Перевод контента - три подхода
доп поля с суффиксом языка - если языков не много и БД не получится сильно разреженной
доп таблицы, с доп связями к основной - если языков крайне много

ну и самый так себе - пилить жсон
Ответ написан
Комментировать
ThunderCat
@ThunderCat Куратор тега MySQL
{PHP, MySql, HTML, JS, CSS} developer
Значится так, имея множественный опыт мультиязычных сайтов:
вариант с файлами самый гнилой, причем как для перевода темплейтов, так и для переводов словарных.
жсон в таблицах - пока фича новая, еще никто нигде не отписался о скорости работы, я регулярно этот вопрос просматриваю - отсюда вывод - хз как оно работает.

Пока самым верным решением для перевода статей и т.п. является таблица с языками + таблица со значениями, в которой есть:
id | groupid | languageid | contetnt | e.t.c...
по группе выбирается нужный объект, по лангвижу - соответствующий язык.
для перевода темплэйтов - таблица похожая:
id | alias | languageid | contetnt
в шаблонах прописывается хелпер, который по алиасу тащит нужную фразу/слово.
Удобно и гибко, любое количество языков искаропки.
Ответ написан
Sanasol
@Sanasol
нельзя просто так взять и загуглить ошибку
zoonman
@zoonman
⋆⋆⋆⋆⋆
Я бы рекомендовал простую таблицу:

locale_id
content_id
content_type
content


Далее отдельный скрипт, который выгружает базу в json файлы с именем locale_id.json и соотвествующей структурой внутри.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы