Мне интересно, действительно ли это хорошая практика хранения массивов в базе данных? Я предпочитаю использовать json_encode
, а не serialize
, но просто интересно, хорошая ли это идея. Если нет, то я могу внести небольшие изменения и просто взорвать массив с запятой.
Хранение массивов в базе данных
Ответ 1
Нет, это ужасная практика. Пожалуйста, воздержитесь от вставки CSV, JSON *, serialize()
или любого рода сериализованных данных в реляционную базу данных. Денормализация почти всегда плохая идея - не делайте этого, если вы действительно не знаете, что делаете, или вы начнете спрашивать
такие вопросы, как: this, this, this, this,...
Выполняя это, вы теряете или это серьезно мешает вашей способности:
- Используйте
JOIN
s. - Поиск или изменение определенного элемента
- Обеспечение ссылочной целостности
- Преимущества использования индекса
- И он также тратит пространство
Это может звучать педантично, но, видя, что люди это делают, это одно из моих любимых мотивов - особенно в свете множества вопросов, заданных на SO, которых можно было бы избежать, если бы они сделали правильный путь.
Здесь правильный путь для выполнения отношений "один ко многим" и "многие ко многим" в РСУБД.
* Хотя некоторые базы данных SQL имеют встроенную поддержку JSON, часто лучше реструктурировать ваши данные, чтобы вам не понадобилось это
Ответ 2
Зависит от вашего шаблона использования. Если вам понадобится доступ к небольшим частям массива (например, для использования в предложении where или аналогичном), тогда это плохая идея - вы теряете все преимущества хранения данных в реляционной базе данных, Relatable. В конечном итоге вы получите большие накладные расходы, которые извлекают эту небольшую часть данных снова и снова.
С другой стороны, если вы просто используете базу данных в качестве хранилища данных и никогда не нуждаетесь в том, чтобы срезать этот сохраненный массив отдельно - просто вставляйте и извлекайте, то, вероятно, нет проблем вообще, кроме, может быть, потери пространства, поскольку формат serialized/json'd имеет тенденцию быть "многословным" и занимает больше места, чем само исходные данные.