PHP / MySQL – Хранение данных массива как JSON, плохая практика?

Мне было интересно, является ли сохранение массива как строки JSON в текстовом поле mysql хорошей практикой.

Я создаю счет-фактуру, которая позволяет пользователю добавлять неограниченное количество продуктов в счет-фактуру. Когда форма отправляется, она извлекает все пустые элементы и т. Д., Но я обычно буду иметь 2-5 позиций в зависимости. Каждый предмет имеет sku, цену, имя и описание.

Моими параметрами этой ситуации являются (1) создание новой таблицы продуктов, добавление каждого элемента в новую строку, привязка его к таблице счетов и вызов обеих таблиц при доступе к данным. Или (2) хранить все данные продукта как одно текстовое поле JSON в таблице счетов, а затем я не создаю или не получаю доступ к другой таблице.

Поскольку я довольно жесткий с MySQL-программированием, у меня возникает ощущение, что использование JSON в MySQL будет неодобрительно. Я прав? Может кто-то пролить свет на это?

Если все, что вам нужно, просто хранить – тогда это не плохая практика.

Но если вам нужно выполнить какую-либо обработку, сортировку или что-то подобное – вам нужно ее нормализовать.

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

Сохранение переменной количества элементов, которые просто попросят быть сущностью базы данных (SKU, Price, Name, Description), поскольку JSON может быть в порядке сейчас, но это приведет к тонне дублирования данных.

Вместо этого сделайте то, что вы сказали, и создайте таблицу для всех продуктов. Затем создайте другую таблицу для invoices_have_products . Затем вы можете вывести каждую строку из invoices_have_products где совпадает идентификатор счета, а затем вытащить каждую строку из products где идентификатор продукта соответствует строкам, которые вы вытащили из invoices_have_products .

Сейчас это может стать немного утомительным, но когда все ваши данные будут в аккуратных таблицах и легко доступны для запроса, вы будете намного счастливее. Подумайте о кошмаре запуска отчетов о миллионах текстовых полей с JSON. Абсолютно ужасающе.

Чтобы ответить на часть вашего вопроса: Нет, я не думаю, что это хорошая практика, и, честно говоря, это выглядит немного плохой практикой.

Я не эксперт по MySQL, но я думаю, что это зависит от того, чего вы хотите достичь. Вы хотите, чтобы продукты, которые вы сохранили в счете, можно было искать? Если это так, вам лучше идти с реляционной структурой базы данных.

Если вам не нужно искать, вы можете хранить данные как строку JSON или просто как сериализованный массив и вообще не использовать JSON.

В зависимости от ваших потребностей.

Если вы храните его в JSON, вы не сможете запросить его с помощью SQL. Например, я не могу узнать все счета-фактуры, которые купили более трех продуктов А.