Nikito4ka_ka
@Nikito4ka_ka

Как правильно хранить image на сервере (в mysql)?

Здравствуйте, подскажите как лучше всего хранить Image на сервер

Backend - node.js sequalize mysql
Frontend - React.js

Задача такова, что есть обьект в таблице mysql, при запросе с Frontend выводим имя обьекта и фото которое ему принадлежит. Как лучше реализовать хранение image?

Знаю вариант такой:
загружаем файл на сервер - > генерируем имя файла - > генерируем путь -> сохраняем путь к img в поле таблицы обьекта
Как считаете имеет ли смысл искать другое решение или этого будет достаточно?
  • Вопрос задан
  • 153 просмотра
Решения вопроса 1
@rPman
Хранить в файлах
Можно не генерировать имя файла а использовать идентификатор из базы данных (не обязательно числовой, можно брать hex от его байтового представления), чтобы не заморачиваться с расширением, его можно либо стандартизировать либо не указывать (но тогда либо где то храни его mime type либо каждый раз высчитывать его с помощью утилиты file). Если будет расширение файла, то веб сервера смогут отдавать такие файлы максимально эффективно статикой, напрямую без бакэнда (при унификации типа файла это не требуется).

Так же для удобства обслуживания действительно больших баз (миллионы изображений) можно раскидывать их по подкаталогам, считая имя каталога как некоторые биты от идентификатора, к примеру имя файла 00f1b3f3.png но хранить его в подкаталоге 00f1/b3f3.png в этом случае один каталог не будет содержать файлов больше некоторого лимита (в данном случае 2^16 - 65536, с таким объемом вполне сносно работают почти любые утилиты)

p.s. хранение в блобах сопряжено с некоторыми проблемами обслуживания базы данных, так как транзакционные базы работают с блобами заметно медленнее, особенно на запись, то восстановление многотерабайтовой базы может занять очень много времени (сутки и даже недели), когда как простое копирование файлов отработает за часы.

p.p.s. бонус от хранения в блобах можно увидеть как унификация обслуживания базы данных, не нужно синхронизировать файлы и базу данных (расхождения возможны при сбоях) а так же можно настроить штатную репликацию БД и получить красивую репликацию данных на лету на ноды кластера...
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
@humoured
Вы всё на свете найдёте в коробке с карандашами
Хранить тело бинарного файла в базе — идея ниже среднего и оправдана в редчайших случаях.
Самым распространённым способом сейчас можно назвать использование S3-compatible хранилищ: просто загружаем пользовательский файл туда и храним идентификатор/urn файла.
Ответ написан
@KukuRuku
Считаю, что достаточно. Только я бы добавил ещё полей в таблицу — width, height, fileSize, может быть description.
Ответ написан
@caballero
Программист
лучше всего в БД
в отдельной myisam таблице
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы