Лучшая стратегия хранения документов в SQL Server 2008
Одна из наших команд будет разрабатывать приложение для хранения записей в базе данных SQL2008, и каждая из этих записей будет иметь связанный файл PDF. В настоящее время около 340 ГБ файлов, причем большинство (70%) составляют около 100 тыс., Но некоторые из них имеют размер в несколько мегабайт. Данные в основном вставляются и читаются, но файлы иногда обновляются. Мы обсуждаем следующие варианты:
-
Храните файлы в виде BLOB в базе данных.
-
Храните файлы за пределами базы данных и сохраняйте пути в базе данных.
-
Используйте функцию фильтрации файлов SQL2008 для хранения файлов.
Мы прочитали лучшие практики Micrsoft в отношении данных потока, но поскольку файлы различаются по размеру, мы не знаем, какой путь выбрать. Мы склоняемся к варианту 3 (filestream), но имеем несколько вопросов:
-
Какую архитектуру вы бы выбрали, учитывая количество данных и размер файлов, отмеченных выше?
-
Доступ к данным будет осуществляться с использованием проверки подлинности SQL, а не проверки подлинности Windows, и веб-сервер, скорее всего, не сможет получить доступ к файлам с помощью Windows API. Будет ли это делать поток потока хуже, чем два других варианта?
-
Так как резервные копии SQL включают данные потока, это приведет к очень большому резервному копированию базы данных. Как другие обрабатывают базы данных с большим количеством данных для фильтрации?
Ответы
Ответ 1
Хорошо, здесь мы идем. Вариант 2 - это действительно плохая идея - вы получаете непроверяемые ограничения целостности и резервные копии, которые не гарантируют согласованности для каждого определения, потому что вы не можете использовать резервные копии времени. Не проблема в сценариях MOST, она превращается в один момент, когда у вас есть более сложный (момент времени).
Варианты 1 и 3 довольно равны, хотя и с некоторыми последствиями.
- Filestream может использовать намного больше дискового пространства. В принципе, каждая версия имеет руководство, если вы делаете обновления, старые файлы остаются до следующей резервной копии.
-
OTOH файлы не учитываются как размер db (экспресс-выпуск - не против ограничения 10gb, если вы его используете), и доступ к нему еще возможен, используя общий ресурс файла. Это добавляет гибкость.
-
В базе данных есть самые ограниченные возможности доступа (нет возможности для веб-сервера просто открыть файл после получения пути из sql - он должен направить полный файл через уровень протокола sql), но имеет преимущества в том, что у них меньше файлов (номеров). Помещение капли в отдельную таблицу и что один отдельный набор шпинделей может быть стратегически хорошей идеей.
Относительно ваших вопросов:
1: Я бы пошел в хранилище базы данных. Попробуйте оба - filestream и нет. Поскольку вы используете тот же API в любом случае, это простое изменение в определении таблицы.
2: Да, хуже прямого доступа к файлам, но он будет более защищен, чем прямой доступ к файлам. В противном случае я не думаю, что поток и blob имеют существенную разницу.
3: где у вас есть огромная резервная копия? Извините, но спросите, но ваш 340gb - это не совсем большая база данных. И вам нужно поддержать его в любое время. Лучше сделайте это в одном согласованном состоянии, чего вы достигнете при хранении db. Плюс целостность (никто не случайно удаляет неиспользуемые документы без очистки базы данных). БД не намного больше, чем выполнение этого разделения, и это простая резервная копия одного места.
В конце концов, вопрос заключается в целостности и простоте резервного копирования. Выиграйте для SQL Server, если вы не получите большой - и это означает, что 360 терабайт данных.
Ответ 2
Храните файлы за пределами базы данных и сохраняйте пути в базе данных.
поскольку для хранения файлов в базе данных требуется слишком много места.
Ответ 3
Я бы определенно рекомендовал (3) - это сценарий, который эта функция специально построена для обработки, и, на мой взгляд, она очень хорошо справляется.
В этом техническом документе есть много полезной информации - http://msdn.microsoft.com/en-us/library/cc949109(SQL.100).aspx - и с точки зрения безопасности упоминает, что...
Существует два требования безопасности для использования функции FILESTREAM. Во-первых, SQL Server должен быть настроен для интегрированной безопасности. Во-вторых, если будет использоваться удаленный доступ, то SMB-порт (445) должен быть включен через любые системы брандмауэра.
Что касается резервных копий, см. принятый ответ на этот вопрос - Ограничение FILESTREAM SQL Server
Ответ 4
Я использовал метод Index/Content, который вы не указали, но может помочь. У вас есть таблица файлов, которые хранятся в виде блока двоичного кода с уникальным номером id или строки. Следующая таблица SQL предоставит индекс, имя файла, путь к нему, ключевые слова, тип файла, размер файла, контрольную сумму... что вам нужно. Это лучшее, что я видел, чтобы хранить файлы для работы с тысячами загруженных документов. Индекс необходим для просмотра файла, поскольку он будет просто двоичным текстом для пользователя, если они не имеют представления о типе файла. Мы сохраняем данные в двух отдельных базах данных, чтобы можно было легко индексировать один сервер и хранилище файлов на нескольких серверах. В этот момент индексная таблица/база данных содержит имя или ключ к серверу, на котором находится файл. Если у пользователя есть доступ к чтению этой конкретной индексной таблицы, они имеют доступ к файлу.
Ответ 5
Вы посмотрели решение RBS (Remote Blob Storage)? Если вы используете провайдер Filestream RBS, он будет внутренне сохранять ваши капли в виде файлов Filestream или значений varbinary (max), в зависимости от того, что улучшает производительность на основе размера blob.
Спецификация реализации библиотеки поставщика BLOB-хранилища
SQL Remote Blob Storage Team Blog
Ответ 6
Этот сценарий прост: рекомендация FILESTREAM говорит, что лучше всего, когда файлы (в среднем) больше 1 МБ, что не является вашим случаем, для небольших объектов хранение двоичных (макс.) BLOB в базе данных часто обеспечивает лучшую поточную передачу представление.
Поскольку вы будете обращаться к файлам непосредственно с SQL Server, а не из файловой системы, тогда вы должны хранить их с помощью BLOB.
Прочтите, когда использовать FILESTREAM: http://technet.microsoft.com/en-us/library/bb933993%28v=sql.105%29.aspx