Хранить изображения в SQL Server?


192

Я сделал небольшой демонстрационный сайт, и на нем я храню изображения в столбце изображений на сервере SQL. У меня есть несколько вопросов ...

  • Это плохая идея?

  • Повлияет ли это на производительность моего сайта, когда он растет?

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


5
Есть ли новое дополнение к этому выпуску в 2017 году? Это все еще в силе на сегодня?
Хайкал Нашуха

Ответы:


274

Есть действительно хорошая статья Microsoft Research под названием « Для блобов или не для блобов» .

Их заключение после большого количества тестов производительности и анализа таково:

  • если размер ваших изображений или документа обычно не превышает 256 КБ, их хранение в столбце VARBINARY базы данных более эффективно.

  • если размер ваших изображений или документа обычно превышает 1 МБ, их хранение в файловой системе более эффективно (а с атрибутом FILESTREAM в SQL Server 2008 они все еще находятся под контролем транзакций и являются частью базы данных)

  • между этими двумя, это немного путаница в зависимости от вашего использования

Если вы решите поместить свои изображения в таблицу SQL Server, я настоятельно рекомендую использовать отдельную таблицу для хранения этих изображений - не храните фотографию сотрудника в таблице сотрудника - храните их в отдельной таблице. Таким образом, таблица «Сотрудник» может оставаться скудной, средней и очень эффективной, при условии, что вам не всегда нужно выбирать фотографию сотрудника, как часть ваших запросов.

Для файловых групп , ознакомьтесь с Файлами и Архитектурой Файловых Групп для вступления. По сути, вы либо создадите свою базу данных с отдельной файловой группой для больших структур данных с самого начала, либо добавите дополнительную файловую группу позже. Давайте назовем это «LARGE_DATA».

Теперь, когда у вас есть новая таблица для создания, в которой нужно хранить столбцы VARCHAR (MAX) или VARBINARY (MAX), вы можете указать эту группу файлов для больших данных:

 CREATE TABLE dbo.YourTable
     (....... define the fields here ......)
     ON Data                   -- the basic "Data" filegroup for the regular data
     TEXTIMAGE_ON LARGE_DATA   -- the filegroup for large chunks of data

Ознакомьтесь с введением MSDN в файловых группах и поэкспериментируйте с ним!


Хорошо это или плохо ... • если ваши изображения или документ обычно имеют размер более 1 МБ, их хранение в файловой системе более эффективно (а с атрибутом FILESTREAM в SQL Server 2008 они все еще находятся под контролем транзакций). и часть базы данных)
htm11h

Отличный ответ. Если вы чувствуете , как объяснить подробно , почему вы рекомендуете использовать специальную таблицу для данных изображения, я создал отдельный вопрос для этого на dba.SE .
Хайнци

16

Однажды я попал в эту дилемму и довольно много исследовал в Google для мнений. Я обнаружил, что на самом деле многие считают, что сохранение изображений на диск лучше для больших изображений, в то время как mySQL обеспечивает более легкий доступ, особенно из таких языков, как PHP.

Я нашел похожий вопрос

MySQL BLOB против файла для хранения небольших изображений PNG?

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

Надеюсь, поможет


14

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

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

Вы можете узнать больше об использовании файловых групп здесь http://msdn.microsoft.com/en-us/library/ms179316.aspx .


12

Почему может быть хорошо хранить изображения в базе данных, а не в каталоге на веб-сервере.

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

Теперь они приходят к вам. Их сервер был уничтожен, и им нужно восстановить его на новом сервере. У них больше нет доступа к старому серверу. Единственная резервная копия, которую они имеют, является резервной копией базы данных.

Конечно, у вас есть исходный код, и вы можете просто развернуть его на новом сервере, установить SqlServer и восстановить базу данных. Но теперь все картинки исчезли.

Если вы сохранили картинки в SqlServer, все будет работать как раньше.

Просто мои 2 цента.


3
Хорошая точка зрения. Резервное копирование изображений так же важно, как резервное копирование базы данных ... иногда даже более того.
Крис Катиньяни

Также изображения в файловой системе должны иметь сетевые разрешения.
Крис Катиньяни

2
Сетевые разрешения - это хороший момент. Но я не вижу случая, чтобы у вас была только резервная копия БД. У вас наверняка будет резервная копия приложения и файлов. Вы можете так же легко потерять БД, но иметь файлы.
Норберт Норбертсон



7

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


0

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.