SQL Server 2008 — Хранение файлов

Я создаю веб-приложение MVC3 для базы данных SQL Server 2008. Веб-приложение позволит пользователям загружать фотографии и документы.

В настоящее время файлы хранятся в столбце типа «изображение».

Это нормально или это устаревший подход?

Есть ли какие-то преимущества в переносе хранилища на другой тип данных или переходе на использование FILESTREAM?

Статистика — 500 (пользователей) x 7 (среднее количество документов на каждого) x 2 МБ (средний размер документа)

ИЗМЕНИТЬ 1

Кто-нибудь может прокомментировать; то, что я делаю в настоящее время - хранение как тип данных "изображение" - плохо?


person Paul Brown    schedule 31.03.2011    source источник
comment
Да, тип данных IMAGE устарел с 2005 года — используйте вместо него VARBINARY(MAX).   -  person marc_s    schedule 01.04.2011


Ответы (5)


(Перемещение моих комментариев в ответ)

Из MSDN: ntext, Типы данных текст и изображение будут удалены в будущей версии Microsoft SQL Server. Избегайте использования этих типов данных в новых разработках и планируйте модифицировать приложения, которые в настоящее время их используют. Вместо этого используйте nvarchar(max), varchar(max) и varbinary(max).

Это «плохо», если вы заботитесь о запланированном устаревании типа данных. Похоже, что varbinary(max) или даже filestream будут предпочтительными типами данных в будущем.

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

person JustinStolle    schedule 31.03.2011

Вы должны хранить изображения в файловой системе. См. эту тему: Хранение изображений в БД - да или нет?

Что касается документов, это просто статические файлы, которые пользователь загружает/скачивает, или вы будете искать контент в документах? Нужно ли делать что-то особенное с документами?

person mfanto    schedule 31.03.2011
comment
+1, эту ссылку стоит хорошо прочитать, чтобы узнать плюсы и минусы - person Abe Miessler; 01.04.2011
comment
Тогда я бы тоже хранил документы в файловой системе. Особенно, если это документы Office с большим количеством метаданных, вы будете использовать дорогое хранилище без настоящих профессионалов. - person mfanto; 01.04.2011
comment
Хранение их отдельно также означало бы, что вам придется создавать их резервные копии отдельно, а также вводит возможность того, что ваши таблицы могут ссылаться на файлы, которых нет, для чего это стоит. - person JustinStolle; 01.04.2011

Вы можете проверить новый тип данных FILESTREAM в SQL SERVER 2008. Прочтите ссылку — она даст вам некоторые рекомендации по выбору подходящего типа хранилища.

person dugas    schedule 31.03.2011

Microsoft Research опубликовала действительно хорошую статью под названием To Blob or Not To Blob.

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

  • если ваши изображения или документ обычно имеют размер менее 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 по файловым группам и поэкспериментируйте с ней!

person marc_s    schedule 01.04.2011

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

person Abe Miessler    schedule 31.03.2011