Как правильно хранить файлы, фото, видео?

Да, да! Я знаю что такие вопросы уже задавали не 1 десяток раз, но прочитав несколько я всё ещё не понимаю где и как нужно хранить файлы, фото, видео. Допустим мне нужно хранить аватарку пользователя. Как мне это сделать? В базе хранить ссылку на фото, а где хранить само фото?
  • Вопрос задан
  • 133 просмотра
Решения вопроса 2
@rPman
Самое простое и правильное - в файле, как есть, для удобства обслуживания в файловой системе, контейнер которой отделен от всего остального (лучше отдельный раздел или диск, но при особой бедности - файл, который можно примонтировать в любой фс, например в windows это .vhd/.vhdx образы, а в linux вообще просто образ диска в raw формате), зачем отдельное устройство? - для упрощения обслуживания, когда там будет миллион файлов... в linux настоятельно рекомендую пользоваться cow fs (btrfs/zfs/xfs) ради встроенных бесплатных транзакций на основе снапшотов, плюс инкрементальные бакапы эффективно делать.

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

Во многих случаях рекомендуется не хранить много (десятки тысяч) файлов в одном каталоге, отсюда сразу напрашивается способ - если имя файла состоит из цифр (или hex или вообще base64, на выбор) то разбив его на фиксированной длины части можно использовать их как имена каталогов, последняя часть - имя собственно файла в них (типа /datastore/0d6a/011fc/0012.jpeg).

Достоинства
- для web, файлы очень эффективно могут быть отданы веб сервером (при необходимости права доступа разруливаются basic auth либо временными симлинками, хз что дороже)
- с файлами могут работать огромное количество утилит, поиск, копирование, редактирование, просмотр.. напрямую, когда как с любым другим хранилищем сначала файл придется от туда извлечь, т.е. понадобится соответствующий инструмент

Недостатки
- наверное единственный заметный - файловая система не интегрирована с sql базой данных, а это значит при возникновении каких либо проблем, например удаляли файл в базе, но из-за ошибки или сбоя какого-либо, на диске файл не удалили, и он остался так висеть, обнаружить такое, на особо больших хранилищах - дорого
- если файлы раскидывать по подкаталогам (имя - идентификатор файла) то сама по себе эта операция не бесплатная и при большом количестве вложенностей повышает нагрузку на процессор и накладные расходы на диск, незначительно но заметно на больших архивах (такова цена за бесплатный key-value индекс), в некоторых ситуациях можно этого не городить, храня файлы в одном каталоге, но миллион файлов могут создать проблемы привычным утилитам.

p.s. ну или вот qna.habr.ru/q/10694/#answer_46206
Ответ написан
Комментировать
firedragon
@firedragon
Не джун-мидл-сеньор, а трус-балбес-бывалый.
правильно хранить в файловой системе DIXY.
Это произрастает из самой сути вещей, файлы в файловой системе, данные в бд.
Взрослые бд могут прожевать 10 гигабайт, для общеупотребительных это проблема. Если что я про бэкапы. При желании поищите как восстановить большой дамп MySql.
Кроме того есть проблема лицензирования. Да и места больше занимает.

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

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

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