Здравствуйте. У меня возникла такая проблема: мне нужно хранить около 200 тисяч картинок в месяц ( картинка здесь в основном скан документа). Как можно подсчитать, за год мы будем имеиь 2,4 млн картинок. И тут вопрос: как лутше их хранить? в интернете я прочитал пару подходов: хранение как BLOB, хранение файлов, а в БД только ссылку на файл. При этого однозначного ответа нет. Так все таки что Лутше? Для меня важно быстродействие и целестность. Сервер БД достаточно мощный и проведе анализ запросов, я дозволено их быстродействием.
Тут есть нюансы. Если вы будете хранить изображение в базе в виде BLOBа, то когда пользователь запросит с сервера данные все данные будут загружены в память. А это много. С другой стороны если получить только путь к файлу, можно отправить пользователю лишь этот самый путь либо стримить картинку средствами сервера/php. В этом случае потребление памяти будет минимальным.
Хранить в виде BLOB в базе — нельзя!
Только внешние файлы!
А уж при таких количествах — тем более.
А «При этого однозначного ответа нет» только потому, что 18 иконок 16на16 в десктопном приложении ещё терпимо запихать в базу ради облегчения работы ленивого программиста.
Честно говоря думаю легче написать скрипт таким образом чтобы записать ссылку на файл. Во первых, не нужно писать отдельный обработчик в asp.net чтобы получить файл. В любом случае будет менее строк кода. Возможно мне так кажется, Но с точки зрения безплатно ти и целестности в БД хранить безопаснее.
:) я имел в виду не орфографию :) Целостность учитывая что картинки могут существовать отдельно от записей/строк БД нисколько не подвергается опасности при внешнем их хранении. Безопасность просто переносится из СУБД наружу — ОС / сервера приложений. Бесплатность достигается проще при внешнем хранении и если вы имели в виду деньги и если вы имели в виду затраты вычислительных ресурсов.
По поводу безопастности: смотрите, кто-то угадал пароль или взломал мой сервер. Он Имеете доступ ко всем файлам. При этом connection string для подключения к БД хранится зашифрованной. То есть даже если получил доступ к IIS, к БД ты доступа иметь не будешь. То есть я конфигурирую одного Юзера для скрипта, который умеет только читать записи. Если кто взломает сервер, он максимум прочитает записи. А вот добавление будет идти через другую програму под другим пользователем MS SQL Server.
в IIS есть механизм шифрования. Суть в том что каждый IIS при установке генерирует свой ключ, согласно которому шифрует web.config — файл конфигурации. Соответственно скрипт запрашивает у сервера и сервер скрипту возвращает инстанс соеденения. При этом следует взять во внимание что даже если взломать фтп, ключ узнать не получится, таким образом достигается безопастность.
Если у Вас web-проект, то однозначно сохранять в базе ссылки на файлы или называть файлы по значением ключей. Причина: web-сервер и ОС сможет кэшировать эти данные, что достаточно существенно снижает нагрузку.
А что мешает хранить и там и здесь: при загрузке картинки сохраняете в базу данных. Перед базой ставите кеш (файловый кеш или в памяти — самый простой LRU). При доступе проверяете кеш, если нет в кеше, идете в базу и добавляете в кеш. Учитывая то, что кеш будет LRU, то самый популярные будут отдаваться из кеша, а остальное все из базы. База предпочтительней с точки зрения репликации и надежности.