Хранить изображения в SQL Server? - PullRequest
172 голосов
/ 10 апреля 2011

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

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

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

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

Ответы [ 7 ]

236 голосов
/ 10 апреля 2011

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

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

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

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

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

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

Для файловых групп ознакомьтесь с Files and Filegroup Architecture для вступления. По сути, вы либо создадите базу данных с отдельной файловой группой для больших структур данных с самого начала, либо добавите дополнительную файловую группу позже. Давайте назовем это «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 в файловых группах и поэкспериментируйте с ним!

14 голосов
/ 10 апреля 2011

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

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

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

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

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

13 голосов
/ 10 апреля 2011

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

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

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

10 голосов
/ 01 марта 2016

При хранении изображений в SQL Server не используйте тип данных 'image' , в соответствии с MS он постепенно сокращается в новых версиях SQL Server. Используйте varbinary (max) вместо

https://msdn.microsoft.com/en-us/library/ms187993.aspx

9 голосов
/ 13 января 2016

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

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

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

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

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

Только мои 2 цента.

7 голосов
/ 01 марта 2016

Еще одна опция была выпущена в 2012 году под названием «Таблицы файлов»: https://msdn.microsoft.com/en-us/library/ff929144.aspx

2 голосов
/ 18 октября 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...