Мне было интересно, является ли сохранение массива как строки 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. Например, я не могу узнать все счета-фактуры, которые купили более трех продуктов А.