Будете ли вы хранить двоичные данные в базе данных или в файловой системе?

Это вопрос, который был задан раньше (large-text-and-images-in-sql), но главным образом для данных, которые будут изменены. В моем случае данные будут сохранены и никогда не будут изменены. Кажется разумным держать все вместе.

Есть ли причины, по которым я не должен хранить статические двоичные данные в базе данных?

Предполагая, что это разумная вещь, есть ли какие-либо преимущества для хранения таких данных в отдельных таблицах? (Теперь вы можете начать понимать, что я не эксперт по БД...)

Уточнить: Вероятно, будет не более 10-20 пользователей, но они будут в США и Великобритании. Двоичные данные должны быть перенесены в любом случае.

Ответ 1

Преимущество хранения данных в БД заключается в использовании механизмов безопасности БД и уменьшении затрат на поддержку (резервные копии,...). Недостатком этого является увеличение нагрузки на БД и потребление соединений (что может быть дорогостоящим для серверов лицензированных баз данных для каждого соединения). Если вы используете SQL Server 2008, FILESTREAM может быть приятной альтернативой.

Кстати, для веб-приложений (или любых других приложений, которым может потребоваться потоковая передача данных), более разумно хранить данные вне БД.

Ответ 2

Самое большое разочарование, если вы храните BLOBS, - это потребление памяти. Можете ли вы представить, что select * from x будет делать для тысяч записей с 45k-изображением в каждом?

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

Ответ 3

Все эти разговоры о выполнении "select * from table", вызывающие огромные проблемы с памятью и/или пропускной способностью, когда таблица имеет LOB в ней, не являются проблемой. Все, что возвращается, является указателем на заданный объект. Недостаточно репутации, чтобы помещать комментарий в контекст, но люди, смотрящие на это, должны знать, что это НЕ проблема.

Ответ 4

Решение проблемы с точки зрения принципов, реляционная база данных (в основном) предназначена для хранения структурированных данных. Если вы не можете выполнить условие запроса или присоединиться к элементу данных, он, вероятно, не входит в базу данных. Я не вижу изображение BLOB, используемое в предложении WHERE, поэтому я бы сказал, что он находится за пределами базы данных. С другой стороны, CLOB может использоваться в запросах.

Ответ 5

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

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

Я не думаю, что люди должны использовать select * запросы в первую очередь. То, что вы делаете, - это два способа получения данных. Один метод возвращает сводную информацию, второй - возврат блоба. Я не могу представить, почему вам нужно будет вернуть тысячи изображений сразу.

Ответ 6

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

Среди серьезных проблем, которые это вызвало:

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

  • Файлы с изображениями теряют свою "нить". Нет размеров дат и т.д., Если они не сохранены (избыточно) в качестве дат (для которых требуется код для управления).

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

  • "Нам никогда не придется обращаться к изображениям внешне" - опасное предположение.

  • Хрупкость

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

Преимущества? Ничего, о чем я могу думать, кроме того, что в то время это был путь наименьшего сопротивления.

Ответ 7

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

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

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

Ответ 8

Тот, кто имел идею хранения изображения (или другого двоичного документа) в базе данных, не тот, кого я очень доволен. Базы данных предназначены для хранения данных [в основном?] INDADEABLE, DISCRETE. Не BLOB-значения бессмысленных двоичных данных. Если вы сначала использовали BLOB для двоичных данных, вы уже знаете это.

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

Ответ 9

Разве это не то, что были спроектированы LOB или CLOB или....

Мы использовали CLOB для хранения больших зашифрованных транзакций с использованием кредитных карт для крупной системы авиакомпаний.

Потребление памяти является вашим самым большим виновником.

НТН

веселит,

Ответ 10

Некоторые базы данных (например, Postgresql) автоматически сжимают поля, возможно, быстрее, читая их непосредственно из db. А также программа может читать все поля и изображение одним махом.

Ответ 11

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

Под этим я подразумеваю сохранение всех данных в вашей базе данных, но когда кто-то запрашивает этот файл, проверьте, существует ли он на диске (на основе известного имени файла, в папке temp), если нет, возьмите его из базы данных и напишите его в папку, а затем передайте ее пользователю. Для следующего запроса к тому же файлу, поскольку он существует на диске, его можно обслуживать без попадания в БД. Но если вам нужно удалить эти файлы (или ваш веб-сервер идет kapput!), Это не имеет значения, поскольку они будут снова восстановлены из БД, когда люди их просят. Это должно быть намного быстрее, чем обслуживать каждый запрос для того же файла из БД.