dilikpulatov
@dilikpulatov
веб-программист

JSON тип данные в MySQL, в чем минус?

Здравствуйте!
Я пробовал использовать JSON тип данные MySQL...вроде все в порядке.
но мне интересно..в чем-то вредно использовать JSON тип данные? например при запросе в БД замедляет скорост работу?
я использовал жсон в место таблица релешин....то есть например в таблица постов есть поля категории и все категории в одном ячейке в формат жсон сохранено...
при поиске по категории использовал функции JSON_ARRAY и т.д. все работает отлично
  • Вопрос задан
  • 9852 просмотра
Пригласить эксперта
Ответы на вопрос 7
DmitriyEntelis
@DmitriyEntelis
Думаю за деньги
По большому счету это денормализация базы.
Денормализацию стоит применять когда Вы 100% понимаете что делаете, получая в каких-то конкретных условиях ускорение каких-то конкретных запросов, взамен теряя в гибкости при дальнейшей разработке и в производительности во всех остальных местах.

Попробую расписать на Вашем примере (хранить категории поста в свойстве поста в json) чтобы было понятней:

Тут все отлично пока Вам просто нужно выводить категории у поста.

Как только нужно искать по категории - начинаются проблемы, какой нибудь JSON_CONTAINS - будет дико медленным на нормальном объеме данных (ведь ему нужно выполниться для каждой строки таблицы, а индексов то и нет).

Решение - заводить еще одну денормализованное свойство для категорий - в котором хранить id постов.
Но дальше всплывают новые задачи которые в нормализованной базе решаются за 5 секунд, а в денормализованной - нужно опять же кодить:
- поиск по нескольким категориям сразу
- расчет количества постов у категорий
- итд итп.

К чему это я все?
К тому что используйте 3 НФ, и только когда упретесь в реальную производительность базы - начинайте думать про денормализацию.
Ответ написан
Комментировать
Wolfnsex
@Wolfnsex
Если не хочешь быть первым - не вставай в очередь!
JSON тип данные в MySQL, в чем минус?
Основных минусов на мой взгляд несколько:
0. Это MySQL (который в свою очередь стандарты SQL никогда особо не жаловал)
1. JSON в MySQL - имеет не бинарный формат и не индексируется (ну разве что как текст?)
2. В SQL-2016 появилась спецификация для нормальной работы с JSON и когда она будет реализована в MySQL (и будет ли реализована вообще когда-нибудь, с учётом того, что они и куда более старые стандарты реализовать не могут) - неизвестно
3. и т.д.

но мне интересно..в чем-то вредно использовать JSON тип данные? например при запросе в БД замедляет скорост работу?
Нет, Вы же только что сами сказали, что:
Я пробовал использовать JSON тип данные MySQL...вроде все в порядке.
:)))

я использовал жсон в место таблица релешин....то есть например в таблица постов есть поля категории и все категории в одном ячейке в формат жсон сохранено...
Мне кажется, тут вообще вопрос в JSON'е не стоит ни разу... Глядя на то, как Вы обращаетесь с данными... При таком обращении с ними (данными) - по моему, вообще нет никакой разницы, что там будет, JSON или XML или ещё что-нибудь...
Ответ написан
@DenisDangerous
Минусов много. Основной - не обеспечить целостность данных. И возможности выборки очень ограничены. Лучшее применение JSON в mysql это хранение каких-либо конфигов
Ответ написан
Комментировать
rpsv
@rpsv
делай либо хорошо, либо никак
JSON в MySQL - это некий ответ NoSQL (той же MongoDB).
Если вы хотите заменять структуры данных, которые должны быть реляционными - то профита не получите, даже напротив.
В вашем случае: как вытекающая проблема НЕ реляционных баз, при удалении какой-либо категории, она останется у вас в JSON поле и возникнет несогласованность (дополнительно нужно писать процедуру для редактирования ВСЕХ записей, чтобы убрать удаленную категорию), или же вы можете написать любой ID, в том числе и несуществующей категории.
В общем JSON поля это хорошо, когда они используются по назначению.
Ответ написан
Stalker_RED
@Stalker_RED
Разница в скорости и в возможностях выборки. Почитайте как работают базы данных, как строятся индексы и что вообще значит слова реляционная.
Ответ написан
Комментировать
@ktarasov
На самом деле в MySQL 5.7 появились генерируемые поля, которые можно создавать автоматически из данных, находящихся в JSON, что частично решает проблему с индексами и скоростью выборки. Вот статья на эту тему https://habr.com/ru/post/348854/
Ответ написан
Комментировать
trakhtenberg
@trakhtenberg
Ну, если читать мануал, то (цитирую дословно):
JSON - Это относительно новый тип данных, который появился в MySQL версии 5.7.8. Он позволяет нативно хранить и обрабатывать данные в JSON-формате.

В отличие от хранения объектов в виде текста, в использовании специального типа данных есть несколько преимуществ:
  • Валидация JSON-объектов. Если попытаться сохранить неправильный JSON, MySQL сгенерирует ошибку.
  • Возможность нативно работать с JSON, выбирать и обновлять только отдельные части объектов, а не весь объект целиком.
  • MySQL сохраняет тип JSON в специальном внутреннем формате. Такой способ более производительный, чем работа с JSON в виде строки.


На мой взгляд функциональность второго пункта весьма приятная.
Подробнее - https://dev.mysql.com/doc/refman/8.0/en/json.html
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы