Хранение небольшого количества изображений:блоб или фс?

StackOverflow https://stackoverflow.com/questions/325126

  •  11-07-2019
  •  | 
  •  

Вопрос

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

Я нашел похожий вопрос здесь: Хранение изображений в БД:Да или нет, но данные ответы были больше ориентированы на людей, ожидающих многих, тысяч или даже миллионов изображений, тогда как меня больше беспокоят небольшие изображения (JPEG, возможно, размером до 150x150 пикселей) и небольшое их количество:возможно, до одной или двух тысяч.

Как вы относитесь к DB BLOB и файловой системе в этом сценарии? Как клиенты кэшируют изображения из БД или из файловой системы?

Если BLOB-объекты, хранящиеся в БД, являются подходящим вариантом, есть ли что-нибудь, о чем мне следует знать? где хранить их?Поскольку я предполагаю, что большинство моих пользователей не будут загружать изображения, следует ли мне создать user_pics таблица для (внешнего) присоединения к обычной users стол, когда это необходимо?


Редактировать:Я вновь открываю этот вопрос, потому что это нет дубликат тех двух, на которые вы ссылались.Этот вопрос конкретно касается плюсов и минусов использования БД или ФС для МАЛОГО количества изображений.Как я уже сказал выше, другой вопрос адресован людям, которым необходимо хранить тысячи и тысячи больших изображений.

Это было полезно?

Решение

Чтобы ответить на часть вашего вопроса:

  

Как клиенты работают с кэшированием изображений из БД и из файловой системы?

Для базы данных: имейте поле last_modified в вашей базе данных. Используйте заголовок Last-Modified HTTP, чтобы браузер клиента мог правильно кэшироваться. Обязательно отправляйте соответствующие ответы, когда браузер запрашивает изображение «если новее» (не могу вспомнить, как он называется; какой-то заголовок HTTP-запроса).

Для файловой системы: сделайте то же самое, но с измененным временем файла.

  

Если большие двоичные объекты, хранящиеся в БД, - это то, что мне нужно, я должен знать, где их хранить? Поскольку я полагаю, что большинство моих пользователей не будут загружать изображение, я должен создать таблицу user_pics для (внешнего) присоединения к таблице обычных пользователей, когда это необходимо?

Я бы поместил большой двоичный объект и связанные с ним метаданные в его собственную таблицу с некоторой взаимосвязью между ней и вашей пользовательской таблицей. Это облегчит оптимизацию метода хранения таблиц для ваших данных, упростит задачу и оставит место для возможности расширения (например, общая таблица «files»).

Другие советы

Однажды я столкнулся с похожим вопросом с небольшой DMS для PDF-файлов. Сценарий отличался от вашего: максимум 100 файлов размером до 10 МБ каждый - не то, что вы ожидаете от фотографий профиля. Но ответ, который дал мне друг, относится и к вашему делу:

  

Используйте каждую систему хранения для того, для чего она предназначена.

     

Храните данные в базе данных . Храните файлы в файловой системе .

Это не окончательный ответ (*), но хорошее правило для начинающих.

Я никогда не слышал о том, чтобы Windows FS была медленной и иногда ненадежной, как заявляет Аарон Дигулла в своем ответе. Если есть такие проблемы, это, безусловно, необходимо учитывать. Но для аватаров это не так важно.

(*) Я знаю, я знаю, 42 ...

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

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

Если вы используете MSSQL, убедитесь, что BLOB-объекты хранятся в отдельном файле данных. Не в ПЕРВИЧНОМ, как все остальное.

В Windows поместите в базу данных как можно больше данных.Файловая система несколько медленная, а иногда даже ненадежная.

В Linux у вас больше возможностей.Здесь вам следует рассмотреть возможность перемещения больших файлов в файловую систему и просто сохранить имя в БД.Если вы используете современную файловую систему, такую ​​как Ext3 или ReiseFS, вы даже можете создавать множество небольших файлов с довольно хорошей производительностью.

Вам также необходимо принять во внимание, как вы можете получить доступ к данным.Если у вас есть все в БД, у вас один путь доступа, вам не нужно беспокоиться о другом наборе разрешений, но вам придется иметь дело с дополнительной сложностью чтения/записи BLOB-объектов.Во многих БД поиск BLOB-объектов невозможен.

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

Я бы сохранил их в базе данных:

<Ол>
  • Резервное копирование / восстановление выполняется легко (если вы создаете резервные копии файлов, а также базы данных, восстановление на определенный момент времени становится более сложным)
  • Транзакции в БД означают, что вы никогда не должны указывать на имя файла, которого там нет
  • Меньше шансов, что кто-нибудь придумает хитрый способ размещения скрипта на вашем сервере с помощью хитроумного способа загрузки изображений
  • Поскольку речь идет о небольшом количестве изображений, простота использования / администрирования должна иметь преимущество перед проблемами производительности, которые обсуждаются в связанных вопросах.

    Я думаю, есть преимущество в управляемости, сохраняя их в базе данных; они могут быть зарезервированы и восстановлены в соответствии с другими данными - вы не забудете удалить устаревшие (ну, вы могли бы, но это немного менее вероятно), и если вы перенесете базу данных на другой компьютер, изображения будут идти с он.

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top