2010-03-25 3 views
36

У нас есть проект, в котором мы будем строить целую систему CMS, которая будет задействовать весь наш экстранет и интранет с одним пакетом. Вопрос, который я пытался найти, - это лучше: сохранение изображений в базе данных (SQL Server 2005), чтобы мы могли иметь целостность, единый план репликации и т. Д. ИЛИ хранить в файловой системе?Изображения в базе данных и файловой системе

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

Наши проблемы являются следующим:

  • целостности данных
  • репликации данных
  • Несколько резолюций
  • скорость базы данных против файловой системы
  • Накладные нагрузки базы данных против файловой системы
  • Управление данными и резервное копирование

Есть ли у кого-нибудь подобная ситуация или есть какие-либо данные о том, что было бы рекомендовано? Заранее спасибо за помощь!

+0

Repost: http://stackoverflow.com/questions/3748/storing-images-in-db-yea-or-nay – XpiritO

+1

@XpiritO Этот вопрос был очень общим, этот вопрос очень специфичен для его потребностей и включает в себя объяснение его окружения –

ответ

2

Ну, если ваши две лучшие потребности - это целостность и репликация, тогда ответ, безусловно, является БД.

вас другие точки, хотя:

  • Целостность - DB, поэтому базы данных существуют по сравнению с плоскими файловыми системами.

  • Репликация - Не уверен, что вы имеете в виду репликацию изображений, но если это так, то, очевидно, DB, так как вы не будете балансировать нагрузку, конечно.

  • Множество разрешений может быть выполнено с изображения БД, однако это добавляет затраты на обработку. Кроме того, чем выше разрешение, тем больше размер, тем дольше ожидание сети. Множественные разрешения торгуют пространством для скорости.

  • Скорость - в зависимости от доступа к изображениям это может быть незначительным. Если вы делаете изображения через общий ресурс файла, вам придется ждать в сети в любом случае, и сеть почти всегда является узким местом.

  • Накладные расходы - Честно говоря, это зависит от вашего определения накладных расходов и доступа к изображениям.

  • Управление, БД, руки вниз. Единственное хранилище = меньше беспокоиться, и вы всегда должны запускать резервные копии в базе данных в любом случае. Резервное копирование файловой системы на несколько серверов является дорогостоящим.

1

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

Downsides в файловой системе

-не автоматически реплицируются

-Может усложнит репликацию, имея различные физические местоположения для каждого экземпляра

-Slow с очень большим количеством файлов

Потенциал роста файловая система

-Если вы храните несколько очень больших файлов, он будет выполнять Немного лучше.

5

Этот вопрос часто встречается - см. this SO результат поиска.

Ответ правильный - нет, это зависит от обстоятельств.

Лично - сохранить путь к файлу в БД и файл в файловой системе. У каждого свои преимущества. Вы можете делать резервные копии файлов, а также баз данных. Это также вывод this guy, который управляет ТБ данных.

+3

просто убедитесь, что если вы используете файловую систему, чтобы также хранить контрольную сумму, чтобы обнаружить фальсификацию файла. – David

54

Был хороший исследовательский документ, опубликованный Microsoft Research под названием To Blob or not to Blob, где они рассмотрели всевозможные переменные и воздействия.

Их находка в конце:

  • до 256 Кбайт, сгустки хранятся в базе данных более эффективно, чем в файловой системе
  • за 1 МБ и больше, файловая система более между ним эффективный
  • это жеребьевка

Так что статья была опубликована, SQL Server 2008 также добавляется атрибут FILESTREAM, который делает хранение вещей в файловой системе, но при тре ansactional control, реальность. Очень рекомендую вам проверить это!

+8

+1 для отличного источника и эффективного резюме. –

1

Я бы хотел;

1) Назначить уникальный идентификатор (GUID) для каждого изображения 2) Tag/Name изображение с этой GUID 3) Магазин GUID в ОС (File System) 4) хранить полное имя файла (FQN) указатель в базе данных.

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

2

Ваши проблемы разбиваются на два лагеря.Следующие проблемы в пользу сохранения документов в базе данных:

  • целостности данных
  • репликации данных
  • Несколько резолюций
  • управления данными и резервного копирования

Эти проблемы (возможно) в пользу хранения документов на файловая система:

  • Скорость базы данных против файловой системы
  • Накладные нагрузки базы данных против файловой системы

Таким образом, решить, какие вопросы больше всего и выбрать соответственно.

+0

+1 для накладных расходов. Я был поражен повышением производительности, которое я получил от перемещения изображений OUT моей базы данных и в файловую систему для веб-сайта с примерно 3-мя размерами 500 изображений. Сохранение целостности было более сложным (удалить запись и удалить файл), но Apache просто обслуживает файл напрямую, в отличие от запуска CGI для запроса БД и сброса, это действительно изменило ситуацию. – tomlogic

4

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

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

В предложениях по сохранению пути в db отсутствует реальная проблема, которая реплицирует это на нескольких машинах.

1

Я бы не хранить изображения в базе данных по одной причине (мой ответ приходит от SQL Server):

Я не хочу SQL-сервера кэша данных Населенного простых изображений для веба-сайта. Я хочу, чтобы кэш данных действительно имел в нем данные. Кроме того, если у вас многоуровневая архитектура, гораздо проще передать URL-адрес изображения, чем блок двоичных данных. Если вы сталкиваетесь с проблемами, если хотите, чтобы определенные люди видели изображения (безопасность).

+0

Не уверен в SQL-сервере, но Oracle дает администратору базы данных то, что кэшируется, и по умолчанию большие капли не кэшируются. Я бы ожидал, что SQL Server будет иметь что-то подобное. – codenheim

2

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

Инлайн/BLOB хранения

Перевернутый: упрощает архитектуру и внедрение, упрощает резервное копирование и восстановление или миграцию системы; просто сделайте дамп, резервную копию, экспорт (независимо от того, какой термин для вашего аромата БД) и переместите его в новую базу данных. Управление версиями/согласованность обрабатывается БД, поэтому позволяет восстанавливать время в момент. Безопасность/контроль доступа также более чисты, поскольку доступ к BLOB изображения является неотъемлемой частью доступа к общей строке. Перемещение изображения за пределами БД и предоставление HTTP-сервера для его получения, а лучше для параллелизма и масштабируемости, могут иметь проблемы с тем, чтобы люди не могли взламывать URL-адреса и запрашивать изображения, которыми они не владеют. Если вы размещаете их вне БД, убедитесь, что ваша политика безопасности охватывает контроль доступа к изображениям между пользователями. Либо ваша аутентификация HTTP-сервера должна интегрироваться с общей аутентификацией системы, либо ваша программа HTTP-сервера, которая обслуживает изображения, использует какой-то механизм сеанса, чтобы гарантировать, что HTTP-запрос действителен. Это очень большая проблема в базе данных с несколькими арендаторами. Меньше проблемы в одноцелевых, однопользовательских системах с простой аутентификацией.

Даунсайд: Для действительно очень больших баз данных, резервное копирование и восстановление получает разочарование, или даже проблематично и дорого, потому что, когда вы можете иметь небольшой основной набор данных в противном случае, вы можете иметь много Гб или Тб данных изображения. Рассмотрение всего этого, поскольку одна согласованная база данных хороша с точки зрения целостности, но плохо для резервных копий, если вы не используете СУБД с качеством предприятия, настроенным резервным копированием и восстановлением хранилища данных (например, Oracle RMAN и скользящие резервные копии).

Всегда учитывайте время восстановления в любой системе. Если ваши требования к хранению - < - несколько гигабайт, скажем, 50-100 ГБ, и у вас много запланированного резервного пространства, встроенное хранилище чище. Помимо этого, разделение проблем и предоставление файловой системе своей работы становится ключевым преимуществом. Ничто не хуже, чем попытка восстановить, восстановить и открыть огромную базу данных ради небольшой ошибки данных. Время восстановления - моя самая большая проблема.

2

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

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

Несколько моментов, почему вы должны рассмотреть вопрос о FileSystem

  1. Браузер делает всю работу, и Вы получаете выгоду от кэширования прокси изображений и т.д.
  2. Как ответвление выше, вы получите легко использовать Сеть доставки контента (CDN)
  3. репликации данных изображений легко с помощью инструментов, таких как Rsync и т.д.
  4. Processing (т.е. CPU) время резко оптимизированных
1

Спасибо за быстрый ввод, у нас есть только 5-10 ГБ изображений на данный момент, и многое из того, что мы имеем несколько разрешений одного и того же изображения.

Еще одна проблема, которая возникла, заключается в том, что, если мы хотим расширить, чтобы сохранить документы, презентации и видеоизображения? Будет ли поддерживаться метод базы данных, позволяющий нам хранить видео в базе данных и по-прежнему передавать данные во флэш-памяти?

Еще раз спасибо за ввод!

Смежные вопросы