Использование SQL Server в качестве хранилища изображений

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

  •  22-07-2019
  •  | 
  •  

Вопрос

Является ли SQL Server 2008 хорошим вариантом для использования в качестве хранилища изображений для веб-сайта электронной коммерции?Он будет использоваться для хранения изображений товаров различных размеров и ракурсов.Веб-сервер будет выводить эти изображения, считывая таблицу по кластеризованному идентификатору.Общий размер изображения составит около 10 ГБ, но его необходимо будет масштабировать.Я вижу много преимуществ в использовании файловой системы, но меня беспокоит, что SQL server, не имеющий поиска O (1), не является лучшим решением, учитывая, что на сайте много трафика.Было бы это вообще бутылочным горлышком?Какие есть мысли или, возможно, другие варианты?

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

Решение

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

К счастью, Sql Server 2008 позволяет вам получить свой пирог и съесть его тоже с помощью:

Атрибут FILESTREAM

В SQL Server 2008 вы можете применить атрибут FILESTREAM к столбцу varbinary, и SQL Server затем сохранит данные для этого столбца в локальной файловой системе NTFS.Хранение данных в файловой системе дает два ключевых преимущества:

  • Производительность соответствует производительности потоковой передачи файловой системы.
  • Размер большого двоичного объекта ограничен только размером тома файловой системы.

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

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

Разработчики приложений могут работать с данными FILESTREAM с помощью одной из двух моделей программирования;они могут использовать Transact-SQL для доступа к данным и манипулирования ими точно так же, как стандартными столбцами больших двоичных объектов, или они могут использовать потоковые API Win32 с транзакционной семантикой Transact-SQL для обеспечения согласованности, что означает, что они могут использовать стандартные вызовы Win32 для чтения / записи больших двоичных объектов FILESTREAM, как при взаимодействии с файлами в файловой системе.

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

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

Ознакомьтесь с этим техническим документом MS Research (

Я сомневаюсь в этом O(log n) для поиска это было бы проблемой.Вы говорите, что у вас есть 10 ГБ изображений.Предполагая, что средний размер изображения составляет, скажем, 50 КБ, это 200 000 изображений.Выполнение индексированного поиска в таблице для 200 тысяч строк не является проблемой.Это было бы мало по сравнению со временем, необходимым для фактического чтения образа с диска и передачи его через ваше приложение клиенту.

По-прежнему стоит рассмотреть обычные плюсы и минусы хранения изображений в базе данных по сравнению с хранением путей в базе данных к файлам в файловой системе.Например:

  • Изображения в базе данных подчиняются изоляции транзакций, автоматически удаляются при удалении строки и т.д.
  • База данных с 10 ГБ изображений, конечно, больше, чем база данных, хранящая только пути к файлам изображений.Скорость резервного копирования и другие факторы имеют значение.
  • Вам нужно установить заголовки MIME в ответе, когда вы отправляете изображение из базы данных через приложение.
  • Изображения в файловой системе легче кэшируются веб-сервером (например,Apache mod_mmap), или может обслуживаться более компактным веб-сервером, таким как lighttpd.На самом деле это довольно большое преимущество.

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

Если изображения проиндексированы, то поиск не будет большой проблемой. Я не уверен, но я не думаю, что поиск файловой системы - это O (1), больше похоже на O (n) (я не думаю, что файлы индексируются файловой системой).

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

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

Сказав это, нет «правильного» Решение этого.

scroll top