Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Хранение файлов (изображений) в БД... за и против?  [new]
asyx1
Guest
Есть БД (sql2000), хранящая каталог продукции для веб-сайта компании. К каждому товару есть несколько картинок, хранящихся сейчас в виде файлов на веб-сервере и привязкой имени файла к товару в БД. Суммарно это выражается так - сама БД - 100 Мб, плюс 40.000 картинок - 1 Гб

Потребовалась развитие функциональности каталога и появились определенного рода проблемы с хранением картинок отдельно от самих данных. В связи с чем встал вопрос о переносе всех картинок в БД, вот тут я бы и хотел спросить уважаемое сообщество о плюсах и минусах данной идеи, возможно какие-то "бестпрактис". Спасибо.
2 ноя 07, 21:21    [4872868]     Ответить | Цитировать Сообщить модератору
 Re: Хранение файлов (изображений) в БД... за и против?  [new]
Kirill E Ivanov
Member

Откуда: St.-Petersburg
Сообщений: 112
Плюсов не вижу, а минусы итак очевидны.
2 ноя 07, 22:01    [4872965]     Ответить | Цитировать Сообщить модератору
 Re: Хранение файлов (изображений) в БД... за и против?  [new]
asyx1
Guest
мне потребовалось а) разделить системы физически (т.е. на разных серверах) на тестовую и рабочую с постоянной синхронизацией б) ведение версий каталога (branch) с полным дублированием всей информации вкл. картинки

все это можно сделать и так и так.

но когда у тебя есть только одна база - проблем меньше. так что это плюс

а какие очевидные минусы?
2 ноя 07, 23:45    [4873159]     Ответить | Цитировать Сообщить модератору
 Re: Хранение файлов (изображений) в БД... за и против?  [new]
saint
Member

Откуда: Архангельск
Сообщений: 2262
если изображения хранятся в файловой системе IIS, то фронтенд работает быстрее, тк запрос изображения выполняется самим http.sys внутри ядра. Преимущество в производительности. И пожалуй это единственное непоколебимое преимущество.
плюсы хранения в БД - лучшая масштабируемость, возможность использования транзакций, проще поддерживать целостность.
3 ноя 07, 00:31    [4873236]     Ответить | Цитировать Сообщить модератору
 Re: Хранение файлов (изображений) в БД... за и против?  [new]
jekaSQL
Member

Откуда: Бабруйск
Сообщений: 596
Кмк единственный минус, которы может сейчас повлять на решение, это ограничение на размер базы в бесплатном сикуле.
А так, вот это можно почитать - http://research.microsoft.com/research/pubs/view.aspx?msr_tr_id=MSR-TR-2006-45
3 ноя 07, 05:06    [4873426]     Ответить | Цитировать Сообщить модератору
 Re: Хранение файлов (изображений) в БД... за и против?  [new]
ScareCrow
Member

Откуда: Белый город
Сообщений: 16822

>плюсы хранения в БД - лучшая масштабируемость
да неужели?
>для веб-сайта компании
для веба стандартная практика - хранить картинки в ФС, а в базе только пути
к картинкам


Posted via ActualForum NNTP Server 1.4

3 ноя 07, 10:21    [4873513]     Ответить | Цитировать Сообщить модератору
 Re: Хранение файлов (изображений) в БД... за и против?  [new]
asyx1
Guest
jekaSQL, спасибо за ссылку - интересно. у меня картинки в основном меньше 256К и сервер небесплатный

для saint и ScareCrow - работа фронтенда - вопрос интересный, если будет проблема с производительностью выдачи картинок "на лету" из БД, то ее можно было бы решить "кэшированием" картинок в файловой системе. но если "заливка" 1ГБ картинок затормозит весь сервер то тут уже ничего будет не сделать

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

Пока на распутье...
3 ноя 07, 11:41    [4873585]     Ответить | Цитировать Сообщить модератору
 Re: Хранение файлов (изображений) в БД... за и против?  [new]
saint
Member

Откуда: Архангельск
Сообщений: 2262
ScareCrow

>плюсы хранения в БД - лучшая масштабируемость
да неужели?


представьте
3 ноя 07, 11:57    [4873592]     Ответить | Цитировать Сообщить модератору
 Re: Хранение файлов (изображений) в БД... за и против?  [new]
saint
Member

Откуда: Архангельск
Сообщений: 2262
asyx1

если будет проблема с производительностью выдачи картинок "на лету" из БД, то ее можно было бы решить "кэшированием" картинок в файловой системе

каким путем вы заставите http.sys тащить картинки из вашего кеша?
3 ноя 07, 12:01    [4873598]     Ответить | Цитировать Сообщить модератору
 Re: Хранение файлов (изображений) в БД... за и против?  [new]
vbnet2000
Member [заблокирован]

Откуда: Москва
Сообщений: 2459
я всегда стараюсь ничего не хранить в файловой системе

не вижу вообще в ней смысла при наличии SQL

Файловая система - это тот же SQL - только БЕЗ предварительно откомпилириованных планов запросов на эффективное доставание данных

плюс - невероятный гиморой и ограничения с безопасностью при хранении чего-либо в файловой системе - начисто осутсвующая проблема при хранении данных в базе

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

это как бы не теоретические измышления, а результат практики

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

что касается кеширования - опять невпопад - да, IIS сам что-то умеет кешировать из файловой системы - но неужели, блин, кеширование IIS умнее кеширования SQL - что за бред?
3 ноя 07, 12:13    [4873611]     Ответить | Цитировать Сообщить модератору
 Re: Хранение файлов (изображений) в БД... за и против?  [new]
asyx1
Guest
я не говорил что у меня фронтенд под Windows (http.sys) :-)

хотя тем не менее, это правда, фронтенд - так же под Windows и там есть этот самый http.sys, который при помощи .net можно заставить, например, запомнить результат запроса (хоть к базе, хоть к файлу), либо в зависимости от ситуации перенаправлять к файлу или к базе. программная реализация будет зависеть от организации базы. сейчас меня больше всего интересует как не ошибиться в решении по организации этой самой базы
3 ноя 07, 12:14    [4873613]     Ответить | Цитировать Сообщить модератору
 Re: Хранение файлов (изображений) в БД... за и против?  [new]
asyx1
Guest
vbnet2000, полностью согласен по постановке проблем - по практике не знаю, потому и спрашиваю.

По поводу схожей проблемы - кроме всего прочего у меня есть еще и документация, хранящаяся в основном в виде PDF. Пока вопрос меня заботит только про картинки, но если например я все же решу их писать в БД, то возможно возникнет вопрос и про PDF - почему они должны быть отдельно в виде файлов? А вот с ними будет уже все серьезнее, т.к. файлы уже более "тяжелые" от 1 до 6 Мб... так что опять та же проблема с большими объемами данных и еще вот что:

хранение doc, pdf и пр. в виде файлов на сервере с Indexing Service и SQL Server позволяет легко решить вопрос полнотекстового поиска (для pdf требуется примочка от Adobe/др.). хранение файлов в базе исключит эту возможность (так я понимаю?)
3 ноя 07, 12:27    [4873633]     Ответить | Цитировать Сообщить модератору
 Re: Хранение файлов (изображений) в БД... за и против?  [new]
vbnet2000
Member [заблокирован]

Откуда: Москва
Сообщений: 2459
Файловая система - это вообще бред по сравнению с SQL

это что-то унаследованное от дискеток

я видел только однажды некую рекомендацию на использование файловой системы вместо SQL

Экспозито. ASP2
Используйте файловую систему, когда имеете дело с изображениями, размер которых превышает 1МБ, а также в случае, когда изображений очень много, несколько сотен тысяч и много более. В пограничном случае оба решения равно допустимы.
...
SqL-сервер обеспечивает очень быстрое чтение данных с диска и имеет прекрасный механизм кеширования, но протокол TDS (Tabular Data Stream - поток табличных данных), используемых им для передачи данных по сети, явно не рассчитан на передачу больших BLOB-данных.


Но я не думаю, что стоит прислушиваться к этому мнению Экспозито. Я думаю, что что-то он все-таки не асилил при настройке SQL.

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

И даже при ненастроенном SQL - когда в некоторых случаях (например описанных экспозито на его неоптимизированном SQL) - SQL медленнее будет отстреливаться по юзерам чем тупая файловая система - то... остальные преимущества SQL НАГОЛОВУ перевесят тупорылость файловой системы
3 ноя 07, 12:42    [4873662]     Ответить | Цитировать Сообщить модератору
 Re: Хранение файлов (изображений) в БД... за и против?  [new]
vbnet2000
Member [заблокирован]

Откуда: Москва
Сообщений: 2459
насчет полнотекстового поиска в PDF - лежащих прямо в базе
не знаю всех возможностей Adobe
пусть кто-то другой ответит
а лучше - прямо на форум Adobe задать вопрос
3 ноя 07, 12:51    [4873674]     Ответить | Цитировать Сообщить модератору
 Re: Хранение файлов (изображений) в БД... за и против?  [new]
asyx1
Guest
vbnet2000
насчет полнотекстового поиска в PDF - лежащих прямо в базе
не знаю всех возможностей Adobe
пусть кто-то другой ответит
а лучше - прямо на форум Adobe задать вопрос

ну а для полнотекстового поиска по DOC, TXT?
3 ноя 07, 13:22    [4873717]     Ответить | Цитировать Сообщить модератору
 Re: Хранение файлов (изображений) в БД... за и против?  [new]
vbnet2000
Member [заблокирован]

Откуда: Москва
Сообщений: 2459
TXT ищет нормально канешна. А вот насчет DOC?
какой DOC - который в WordPad? там канешна искать будет

а вот DOCX из Word - думаю нет
скорее всего придется вытаскивать его в память и искать специальными функциями самого ворда

другое дело - я бы засунул эти функции в CLR - написал бы аналог FREETEXT для вордовских файлов

это бует функция строк на десять

и получится FREETEXT_WORD

что касается продуктов ADOBE - они как бы просто логически более развитые, чем MS-продукты - там наверняка есть уже готовые функции для поиска по PDF прямо в базе

а если нет - то какие проблемы самому опять же написать десятистрочкую CLR-функцию поиска в PDF?

ведь документ, хранимый в SQL - это тот же документ один в один, что и документ, хранимый в файловой системе - ТОЛЬКО

упорядоченный в порядке кластерного индекса, имеющий некластерные индексы, с гибким и настраиваемым девелпером САМОСТОЯТЕЛЬНО правом доступа тем или иным юзером

плюс обертки для массовой обработки этих документов типа CLR-функций

тот же аналог CLR полнотекстового поиска для файловой системы - это будет просто пакетный вызов EXEC для каждого из файлов, хранимых в NTFS

за исключением того, что SQL выстрелит ЛЮБЫМИ ДАННЫМИ моментально (благодаря предкопилированным паланам запросов, индесам и причим своим фичам), а файловая система будет дрочиться часами в больших каталогах пока достанет нужный файл
3 ноя 07, 13:37    [4873737]     Ответить | Цитировать Сообщить модератору
 Re: Хранение файлов (изображений) в БД... за и против?  [new]
vbnet2000
Member [заблокирован]

Откуда: Москва
Сообщений: 2459
и не забывайте про кеширование

не факт, что SQL вообще будет обращаться к диску.

он это делает РЕДКО, когда требуемого файла НЕТУ в ОЗУ

а ОЗУ SQL умеет занимать ВСЕ НА КАМПЕ
3 ноя 07, 13:46    [4873753]     Ответить | Цитировать Сообщить модератору
 Re: Хранение файлов (изображений) в БД... за и против?  [new]
vbnet2000
Member [заблокирован]

Откуда: Москва
Сообщений: 2459
Если бы IIS поддерживал VirtualPathProvider для SQL (не хватает времени расковырять это подробнее - скорее всего это и можно даже сейчас)

тогда и сами странички в откомпилированном виде (то что было раньше ASPX и стало после компиляции DLL) - можно было бы уложить в SQL

тогда вообще это самое NTFS - чудо, унаследованное от дискеток - можно б было не задействовать САВСЕМ

и любой сайт бы выглядел просто в виде базы.
восстанавливаешь ОДИН бекап куда-нидь на паркинг - и все

ну максимум - скармливаешь IIS один DLL c классом SQLVirtualPathProvider и WEB-конфиг со строкой коннекта к базе

не сомневаюсь, что это будет В РАЗЫ бестрее, чем в файловой систем. Причем даже упомянутые экспозито ограничения про огромные файлы - тут не стреляют - старнички - это DLL-ки занимающие обычно по пару килобайт

-----------

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

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

на мой взгляд НЕ СУЩЕСТВУЕТ УСЛОВИЙ при которых производительность, надежность, целостность и безовасность данных в SQL могла бы проиграть дискеткам или их наследникам в виде NTFS
3 ноя 07, 14:05    [4873770]     Ответить | Цитировать Сообщить модератору
 Re: Хранение файлов (изображений) в БД... за и против?  [new]
DPH
Guest
Решение с файловой системой и вебом в общем случае действительно производительнее. (Хотя я тоже долго считал наоборот, но убедили)
Причина:

Веб-сервер (не знаю, как IIS, но apache, httpd и т.д.) начинает отдавать пользователю файлы сразу после начала чтения файла (т.е. прочли блок - его и отдаем). Как следствие - очень быстрое начало "отдачи", низкие накладные расходы. Поиск же файла в файловой системе (при разумной организации хранения) примерно такой же, как и в таблице по уникальному ключу (так как дерево каталогов устроено примерно так же, как и индекс, кэширование так же производится). Более того, по крайней мере в *nix'овых файловых системах есть специальные инструменты для подобной потоковой передачи файла.

Для связки же БД - web-server (особенно при наличии еще и сервера приложений посередине) это, увы, практически невозможно, и файл, де-факто, или на уровне БД или на уровне сервера целиком читается в память и только потом отдается наружу.

Впрочем, допускаю, что у MS SQL есть специальный режим работы, позволяющий тесно интегрироваться с тем же IISом - но четыре года назад (когда я последний раз с ним работал) - этого еще не было.
Если такой режим есть - буду рад про него узнать.
3 ноя 07, 14:16    [4873784]     Ответить | Цитировать Сообщить модератору
 Re: Хранение файлов (изображений) в БД... за и против?  [new]
vbnet2000
Member [заблокирован]

Откуда: Москва
Сообщений: 2459
я не соглашусь с этим высказыванием.

1. Отдача (частями или целиком) зависит исключительно от параметра IIS Response.Buffer= true/false
можно ставить например и так или иначе как для чтения из базы, так и для чтения из файловой системы

2. В подавляющем большинстве случаев SQL вообще не будет обращаться в базу - ибо он умеет занять всю память (ну или почти всю) под буфера и будет отдавать IIS'у файлы просто из памяти. У NTFS нету взможности определить буфера чтения с диска размером например в 2 Гигабайта.

3. хотите отдавать частями - давайте Response.Write в поток браузера хоть через сто байт. Это все гибко и управляемо программистом - а не самопроизвольно, как происходит с файловой системой.

4. Поиск же файла в файловой системе (при разумной организации хранения) примерно такой же, как и в таблице по уникальному ключу - это тоже не так. Цитирую по букварю описание SQL - "SQL Server позволяет очень бысть находить строки, удовлетворяющие индексам даже в очень больших таблицах. Так, чтобы найти строку в таблице, содержащей 2,5 миллиона строк, SQL должен проверить всего три страницы данных. И лишь когда в таблице станет более 300 миллионов строк, SQL придется просматривать четыре страницы для поиска нужной строки."
Если вы мне сейчас скажете, что дискетки или их продвинутые родственники - NTFS - могут найти ОДИН НУЖНЫЙ файл из ТРЕХСОТ МИЛЛИОНОВ всего за четыре обращения к диску - я упаду под стол от хохота и не вылезу оттуда до утра.

5. Это лишь самые примитивные БАЗОВЫЕ возможности SQL. Все это можно продвинуть ЕЩЕ И ЕЩЕ. Например с помощью того же секционирования - считывать фрагменты мультипоточно и параллельно.

6. И обсуждается ЛИШЬ один аспект превосходства SQL над FAT/HPFS/NTFS - производительность. Остальные возможности SQL ведь просто вынесены за скобки обсуждения.

7. Другое дело IIS сегодня НЕ ИНТЕГРИРОВАН с SQL. Это да. Если бы он был бы полностью интегрирован - размещение web.config в ублюдочной файловой системе бы НЕ требовалось. Можно было бы прямо в оснастке указать таблу с набором параметров работы приложения. Ну тут уж как всегда в MS - левая нога не знает что делает правая. Но возможно, пройдет время и левая нога (IIS) научится шагать втакт с правой (SQL).
Вот смотрите на рисунок - видите все новые режимы управления IIS уже вынесены в обычные таблы. Ума им только не хватило грузить эти таблы прямо из базы. Будем надеятся что в MS кто-нибудь поумнее со временем примут на работу - и мы сможем увидеть настоящую ИНТЕГРИРОВАННУЮ систему, а не кучу автономных огрызков. И чтобы готовый SQLVirtualPathProvider вошел в стандартный комплект библиотек IIS и VS2005. А так они сдури в комплект VS2005 включили провайдер пути для FrontPage Extension. Я когда это провадер увидел вместо провайдера SQL - чуть со стула не упал...

К сообщению приложен файл. Размер - 0Kb
4 ноя 07, 00:48    [4874521]     Ответить | Цитировать Сообщить модератору
 Re: Хранение файлов (изображений) в БД... за и против?  [new]
vbnet2000
Member [заблокирован]

Откуда: Москва
Сообщений: 2459
к сказанному я хочу добавить, что один из сайтов, который я сейчас ковыряю - один из самых посещаемых в рунете. Грубо говоря - это сайт знакомств. Там планируется многое модифицирвоать, например докрутить загрузку пользователями СВОИХ видео-роликов вдобавку к фоткам.
Мне и в голову не пришло какую-то там ублюдочную файловую систему задействовать для хранения пользовательских видеороликов. Но этот проект будет сдаваться только в следующем году - поэтому я пока не особо его афиширую.
Возможно я сделаю для него виртуал-пач-провайдер, о котороя я говорил выше - и этот сайт будет работать ВООБЩЕ без файловой системы.
По крайней мере оборудования для него закупается на сотни тысяч долларов - и все исходя из планов, что файловая система или СОВСЕМ чуть-чуть (для хранения Web.Config) или ВООБЩЕ СОВСЕМ НИКАК не будет задействована в работе сайта.
Я даже больше скажу - я даже пользовательский профиль для всего этого задействал - те тупо микрософтовскую базу аутентификации. Даже со структурой базы не фантазировал. Впрочем это еще может измениться.
4 ноя 07, 01:22    [4874534]     Ответить | Цитировать Сообщить модератору
 Re: Хранение файлов (изображений) в БД... за и против?  [new]
saint
Member

Откуда: Архангельск
Сообщений: 2262
vbnet2000

вы не правы, и здесь уже было написано почему. Просто вам надо внимательнее вникать в посты собеседников.
по поводу сравнения NTFS и "дискеток". если вы не знаете - NTFS и FAT имеют совершенно разную структуру и принципы адресации файлов. если вам интересно, сами найдете информацию.
елементарный стресстест покажет, что IIS 6.0 будет отдавать по прямым линкам из файловой системы быстрее, чем через ASP.NET с удаленного SQL Server. и никакие ухищрения ASP.NET или SQL вам не помогут.
4 ноя 07, 13:01    [4874765]     Ответить | Цитировать Сообщить модератору
 Re: Хранение файлов (изображений) в БД... за и против?  [new]
asyx1
Guest
Друзья, ваши рассуждения очень интересны, но прежде чем мы в конец сведем тему к полемике NTFS vs. SQL хочу сказать, что в оригинальном вопросе быстродействие IIS не упоминалось и в основном я хотел бы получить советы в_общем_смысле по созданию систем с подобного рода "аттачментами".

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

Кстати, Microsoft Office SharePoint Server (aka Sharepoint), призванный по задумке производителя заменить файловые сервера, сохраняет документы в БД. Но это так, в поддержку рассуждений vbnet2000. Пока я не принял решения...

Спасибо всем еще раз за поддержку.
5 ноя 07, 02:06    [4875501]     Ответить | Цитировать Сообщить модератору
 Re: Хранение файлов (изображений) в БД... за и против?  [new]
эхх.... достало уже:)
Guest
vbnet2000

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


Что за маразм?:))
а если админ грохнет базу, уронит сервак на пол?)

vbnet2000
плюс - невероятный гиморой и ограничения с безопасностью при хранении чего-либо в файловой системе - начисто осутсвующая проблема при хранении данных в базе


Базы тоже вскрываются благодаря "криворукости" тех же кодеров.

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


Да, видать это слишком круто, писать алгоритмы расчета путей. Мне интересно, на хрена менять по сто раз (даже через год) - не правильно спроектировали?

В базе тоже можно по сто раз менять пути - имя поля, имя таблицы, имя сервера:)

vbnet2000
что касается кеширования - опять невпопад - да, IIS сам что-то умеет кешировать из файловой системы - но неужели, блин, кеширование IIS умнее кеширования SQL - что за бред?


кеширование IIS умнее кеширования SQL - Вот это бред полный:).





Топикстартеру:

Учите мат чать Клиент-Сервер - в Вашем случае Браузер/Веб-Сервер:
Картинки скачиваются отдельными потоками.

Настройка кеширования статического контнета (картинок) настривается на ура.
Если у Вас огромная посещаемость и куча картинок - обработку картинок можно вообще вынести на другой сервер (домен) и т.д.

1. Для каждого потока необходимо (картинки в базе) :
Открыть соединение, вытащить картинку, отдать клиенту, закрыть соединение.
2. Картинки в файловой системе: Вам ничего делать не надо, за Вас все сделает сервер.


Вообще все достаточно просто:
Создайте тестовую базу, залейте в нее 1000 картинок по 100 кб и страницу, выводящую все картинки оптом.

Удачи
5 ноя 07, 11:00    [4875758]     Ответить | Цитировать Сообщить модератору
 Re: Хранение файлов (изображений) в БД... за и против?  [new]
Anatoly Podgoretsky
Member

Откуда:
Сообщений: 62917

> Что за маразм?:))
> а если админ грохнет базу, уронит сервак на пол?)

Это уже диверсия, а переименование, перемещение, изменения прав - штатная
ситуация, особенно по пользовательским файлам.


Posted via ActualForum NNTP Server 1.4

5 ноя 07, 11:05    [4875770]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить