Плюсы и минусы хранения файлов (картинок) на сервере SQL для веб-сайта - PullRequest
1 голос
/ 05 января 2012

Я создаю веб-сайт Asp.Net MVC.

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

Но сейчасЯ спрашиваю себя, это хорошая идея для веб-сайта?В представлении производительности?

У меня есть несколько плюсов для меня:

  • Позволяет мне легко контролировать, если подключенный пользователь имеет право отображать изображение (Требуется для моего проекта)
  • Позволяет убедиться, что у нас есть согласованные данные (в противном случае у нас может быть существующий файл, но нет информации в базе данных, и наоборот
  • Мне нужен резервный веб-сервер, и эти файлы будутимпортированные с третьего сервера, поэтому, если эти файлы находятся в базе данных, мне нужно только иметь работающий веб-сайт ASP.Net и реплицированную базу данных на отказоустойчивом сервере, нет необходимости синхронизировать файлы.

Но у него есть и минусы:

  • Есть НЕКОТОРЫЕ большие файлы (это меньшинство, но это случится), например, 100-200 МБ, и я не уверен, что хорошо иметь такой файлв базе данных? (это больше похоже на вопрос;))
  • Я не уверен, что он будет иметь хорошие показатели?

Что вы думаете?Это разумно?Я искал в Интернете, но я не нашел каких-либо аргументов для сайта.Мой вопрос в основном о FILESTREAM VS FILESYSTEM, я уверен, что FileStream медленнее, но много?Потому что, если это всего лишь несколько процентов, выигрыш функциональности того стоит.

Ответы [ 3 ]

7 голосов
/ 05 января 2012

Есть действительно хорошая статья 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 в файловых группах и поэкспериментируйте с ним!

3 голосов
/ 05 января 2012

Зачем использовать БД вместо текстовых файлов?Потому что он быстрее использует индексы.Хранение целых файлов в БД никогда не было хорошей практикой.Используйте db как указатели (указатели) на обычные файлы img.

Что касается ваших плюсов и минусов:

  • , вы можете легко контролировать, имеет ли пользователь право видеть изображение, если вы отображаете изображение с помощью asp / phpи установить корневую папку с изображениями вне веб-корня

  • хранение целых файлов в БД примерно в 10 раз медленнее (я знаю, что для проверки MySQL, но аналогично для mssql - http://blog.sitek.com.au/2008/03/comparison-between-storing-imagesfiles-in-mysql-and-on-filesystem/)

  • если у вас есть файлы в БД, вы не сможете использовать CDN (http://en.wikipedia.org/wiki/Content_delivery_network)

3 голосов
/ 05 января 2012

Если файлы являются неотъемлемой частью и активно изменяют часть системы, и их необходимо резервировать вместе с другими данными - вы можете сохранить их в БД, , но , попробуйте использовать поля FILESTREAM, есливы используете sql server 2005+ и ваши файлы достаточно велики - скажем, 500k +

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

Хранение и работа с файлами внутри БД обычно медленнее, чем в файловой системе, но все зависит от ваших потребностей.

...