@gpm7315

Массив строкой в БД это плохо?

Привет! Допустим для каждого товара магазина есть несколько изображений. Что если вместо дополнительной таблицы хранить в БД список этих изображений одной строкой, а в приложении "разбивать" её split'ом? Насколько это удачное решение или лучше так не делать?

В БД:
"/imgs/products/147832/01.jpg;/imgs/products/147832/02.jpg;/imgs/products/147832/03.jpg"

В приложении (SQLAlchemy):
class Product(Base):
   ...
   _imgs = Column("imgs", Text())

   @property
   def imgs(self):
       return self._imgs.split(";")

   @imgs.setter
   def imgs(self, imgs):
       self._imgs = ";".join(imgs)

PS: я знаю, что у postgres есть тип array
  • Вопрос задан
  • 87 просмотров
Пригласить эксперта
Ответы на вопрос 3
anton_reut
@anton_reut
Начинающий веб-разработчик
Да, плохо. Мне кажется гораздо проще создать отдельную таблицу со столбцами id, product_id и image, потом джойнить, чем городить сплиты или еще какие-то обработчики (потенциально узкое место где вероятны косяки и ошибки).
Ответ написан
Комментировать
inoise
@inoise
Solution Architect, AWS Certified, Serverless
В некоторых случаях так можно и нужно делать, но это очень узкоспецифичные кейсы и оптимизация. Приводите к 3NF и не мучайтесь
Ответ написан
Комментировать
Wolfnsex
@Wolfnsex
Если не хочешь быть первым - не вставай в очередь!
Что если вместо дополнительной таблицы хранить в БД список этих изображений одной строкой, а в приложении "разбивать" её split'ом?
Если у Вас MySQL - там есть поддержка данных типа JSON, который идеально подойдёт для таких целей.

Насколько это удачное решение или лучше так не делать?
Ну как минимум это решение имеет право на жизнь, если Вы не планируете обрабатывать эти данные отдельно (например осуществлять по ним поиск). Но его смысл - лично мне не понятен.

PS: я знаю, что у postgres есть тип array
А ещё у PostgreSQL есть тип JSONB, который позволяет полноценно индексировать поля в формате JSON... Но смысла в таком решении я всё равно особого не вижу, скорее даже наоборот.
Ответ написан
Ваш ответ на вопрос

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

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