Лучший способ хранения двоичных файлов или файлов изображений - PullRequest
6 голосов
/ 08 января 2010

Как лучше всего хранить двоичные файлы или изображения файлы?

  1. База данных Система
  2. Файл Система

Не могли бы вы объяснить , почему?

Ответы [ 5 ]

9 голосов
/ 08 января 2010

Нет лучшего способа, просто куча компромиссов.

Плюсы базы данных :
1. Гораздо проще работать в кластерной среде.
2. Не требует дополнительных ресурсов, таких как файловый сервер.
3. Нет необходимости настраивать операции синхронизации в среде с балансировкой нагрузки.
4. Резервные копии автоматически включают файлы.

База данных Минусы :
1. Размер / Рост базы данных.
2. В зависимости от сервера БД и вашего языка может быть сложно вставить и извлечь.
3. Скорость / Производительность.
4. В зависимости от сервера БД вы должны проверять файлы на вирусы во время выгрузки и экспорта.


File Pros :
1. Для установок с одним сервером и одним сервером базы данных это быстро.
2. Хорошо понимаемая способность манипулировать файлами. Другими словами, легко переместить файлы в другое место, если вам не хватает места на диске.
3. Может проверять на вирусы, когда файлы «в состоянии покоя». Это позволяет использовать обновления сканера.

Файл Минусы :
1. В средах с несколькими веб-серверами требуется доступ к общему ресурсу. Который также должен быть кластеризован для восстановления после отказа.
2. Дополнительные требования безопасности для обработки доступа к файлам. Вы должны быть осторожны, чтобы веб-сервер и / или общий ресурс не разрешали выполнение файла.
3. Транзакционные резервные копии должны учитывать файловую систему.


Выше сказанное, в SQL 2008 есть вещь, называемая FILESTREAM, которая объединяет оба мира. Вы загружаете в базу данных, и она прозрачно хранит файлы в каталоге на диске. При получении вы можете либо извлечь из базы данных; или вы можете перейти прямо туда, где он находится в файловой системе.

4 голосов
/ 08 января 2010

Плюсы хранения бинарных файлов в БД:

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

Минусы хранения бинарных файлов в БД:

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

Плюсы хранения бинарных файлов в файловой системе:

  • Вот какие файловые системы хороши в. Файловые системы будут обрабатывать хорошо дефрагментировать и извлекать файлы (скажем, для потоковой передачи видеофайла в через веб-сервер) скорее всего будет быстрее, чем с дб.

Минусы хранения бинарных файлов в файловой системе:

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

На балансе я бы использовал файловую систему. В прошлом, используя SQL Server 2005, я просто сохранял «указатель» в таблицах БД на двоичный файл. Указатель обычно будет GUID.

Вот хорошая новость, если вы используете SQL Server 2008 (и, возможно, другие - я не знаю): есть встроенная поддержка гибридного решения с новым типом данных VARBINARY (MAX) FILESTREAM. Они логически ведут себя как столбцы VARBINARY (MAX), но за кадром SQL Sever 2008 будет хранить данные в файловой системе.

2 голосов
/ 08 января 2010

Лучшего пути нет.

Что? Вам нужно больше информации?

Есть три способа, которые я знаю ... Один, как байтовые массивы в базе данных. Два, как файл с путем, хранящимся в базе данных. Три, как гибрид (только если позволяет БД, например, с типом FileStream ).

Первое довольно круто, потому что вы можете запросить и получить данные за один шаг. Что всегда приятно. Но что происходит, когда у вас много файлов? Ваша база данных становится большой. Теперь вам приходится иметь дело с большими проблемами обслуживания баз данных, такими как попытки резервного копирования баз данных, размер которых превышает терабайт. А что будет, если вам нужен внешний доступ к файлам? Такие как преобразование типов, массовые манипуляции (изменение размера всех изображений, применение водяных знаков и т. Д.)? Это гораздо сложнее, чем когда у вас есть файлы.

Второй отлично подходит для довольно большого количества файлов. Вы можете хранить их на устройствах NAS, постепенно создавать резервные копии, сохранять базу данных небольшим и т. Д. И т. Д. Но затем, когда у вас много файлов, вы начинаете сталкиваться с ограничениями в файловой системе. И если вы распространяете их по сети, у вас возникают проблемы с задержкой, проблемы с правами пользователей и т. Д. Кроме того, мне жаль вас, если ваша сеть будет перестроена. Теперь вам нужно запустить масштабные обновления базы данных, чтобы изменить расположение файлов, и мне жаль, если что-то испортилось.

Тогда есть гибридный вариант. Это почти идеально - вы можете получить ваши файлы с помощью вашего запроса, но ваша база данных не такая большая. Это решает все ваши проблемы? Возможно нет. Ваша база данных больше не переносима; вы привязаны к конкретной СУБД. И этот материал еще не созрел, так что вы можете наслаждаться процессом прорезывания зубов. И кто сказал, что это решает все проблемы?

На самом деле нет «лучшего» пути. Вам просто нужно определить свои требования, сделать лучший выбор в зависимости от них, а затем смириться с этим, когда обнаружите, что поступили неправильно.

0 голосов
/ 08 января 2010

Лично я никогда не храню изображения в базе данных для повышения производительности.На всех моих сайтах у меня есть папка "/ files", в которую я могу помещать подпапки в зависимости от того, какие изображения я собираюсь хранить.Затем я называю их по соглашению.

Например, если я сохраняю изображение профиля, я сохраню его в "/ files / profile /" как profile_2.jpg (если 2 - это идентификатор учетной записи).Я всегда использую правило, чтобы изменить размер изображения на сервере до самого большого размера, который мне нужен, а затем уменьшать размер, если он мне нужен.Поэтому я бы сохранил "profile_2_thumb.jpg" и "profile_2_full.jpg".

Создавая правила для себя, вы можете просто в коде вызвать img src = "/ files / profile__thumb.jpg"

Вот как я это делаю!

0 голосов
/ 08 января 2010

Мне нравится хранить изображения в базе данных . Это позволяет легко перейти от разработки к производству, просто изменив базы данных (без копирования файлов). И база данных может отслеживать свойства, такие как даты создания / изменения, а также файловую систему.

...