Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Где хранить файлы

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2

Открыть новую тему     Написать ответ в эту тему

Big17

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Дилемма - где хранить файлы - как BLOB-ы в базе или в файловой системе, а в базе - ссылки на них? База используется с web-системой, под IIS.
Пока склоняюсь к хранению в базе, т.к. это позволит индексировать полнотекстовым поиском все файлы с текстом (SQL Server это позволяет).

Всего записей: 147 | Зарегистр. 30-09-2003 | Отправлено: 19:55 01-03-2014 | Исправлено: Big17, 19:55 01-03-2014
A_V

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Big17
попробуйте понять, какие преимущества дает ФС по сравнению с базой? я особых не вижу, учитывая то, что в MSSQL новых версий можно хранить файлы физически отдельно от БД на ФС(см FILESTREAM). так что даже при больших объемах, проблем с бд быть не должно.
единственно, отдача файла напрямую с ФС будет чуток быстрее по сравнению с sql, но тут надо просто протестировать на больших объемах, и понять, на сколько это вам критично.  
ну а вообще БД лучше ФС тем что это более гибко и безопасно. а уж если предполагается использовать full text search, я бы вообще про ФС не думал.

Всего записей: 770 | Зарегистр. 07-04-2002 | Отправлено: 23:19 01-03-2014 | Исправлено: A_V, 23:20 01-03-2014
Dmitry

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
А если учесть, что в последней версии ms sql сервера идея filestream получила развитие в виде file table, то разница между хранением в виде blob'а или в виде файла в ФС пропадает полностью
 
Добавлено:
А если учесть, что в последней версии ms sql сервера идея filestream получила развитие в виде file table, то разница между хранением в виде blob'а или в виде файла в ФС пропадает полностью

Всего записей: 81 | Зарегистр. 24-09-2003 | Отправлено: 02:48 02-03-2014
Big17

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Да, согласен FileStream - хорошая реализация

Всего записей: 147 | Зарегистр. 30-09-2003 | Отправлено: 12:00 02-03-2014
Big17

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Инициировали переход на FileStream, отпишусь по результатам

Всего записей: 147 | Зарегистр. 30-09-2003 | Отправлено: 18:45 06-03-2014
XPerformer



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Big17
Если большое количество разнородных файлов - документы, архивы, исполняемые файлы, картинки, музыка/фильмы, то однозначно - файловая система.
Для маленького числа - разницы нет

Всего записей: 2567 | Зарегистр. 20-06-2011 | Отправлено: 05:30 07-03-2014
Big17

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Спасибо за мнение.
 
 
У кого нибудь есть еще аргументы?

Всего записей: 147 | Зарегистр. 30-09-2003 | Отправлено: 18:31 07-03-2014
XPerformer



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

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

Добавлю, что "разницы нет" означает с точки зрения эффективности/производительности.
С точки зрения трудоемкости реализации и различий в реализации для разных SQL серверов - есть. И это еще один аргумент в пользу файловой системы - легкая переносимость.
Конечно, хранить надо не просто все файлы в одной папке... Разбивать на подпапки (аналогично кешу браузеров), имена файлов кодировать, чтобы они были максимально короткими (хешировать) и т.п.
Для полнотекстового поиска по файлам можно использовать готовое решение, если не ошибаюсь, есть бесплатные эффективные движки, и это тоже аргумент в пользу файловой системы
 
 
Добавлено:
p.s. почитал про файлстрим - это надстройка над файловой системой. Раз такую фичу ввели на уровне сервера, значит, действительно, это эффективнее чем хранить в блобах.

Всего записей: 2567 | Зарегистр. 20-06-2011 | Отправлено: 07:08 08-03-2014
xpin2013



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Big17
Извините меня, я тут просто не могу промолчать. Вы можете хранить файлы исключительно в базе не пересохранять их в файловую систему для браузера. Если Вы используете инструмент Delphi, то без особых замарочек можете использовать компонент:
ID: 29685, Hook TWebBrowser file system
С уважением, автор компонента xpin.
 
Добавлено:
Да не сказал. Если вам надо будет хукать другие библиотеки - это не сложно - скопируйте список используемых IIS библиотек и подключите, далее можете повычёркивать лишние библиотеки.

Всего записей: 291 | Зарегистр. 16-01-2014 | Отправлено: 19:09 08-03-2014
Big17

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Для полнотекстового поиска по файлам можно использовать готовое решение, если не ошибаюсь, есть бесплатные эффективные движки, и это тоже аргумент в пользу файловой системы  

Все-таки полнотекстовый индекс SQL Server-а по хранимым файлам думаю будет эффективней сторонних решений. Как минимум по поддержке типов хранимых файлов (все офисные, pdf, rtf, txt)

Всего записей: 147 | Зарегистр. 30-09-2003 | Отправлено: 00:13 09-03-2014
XPerformer



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Big17
Не уверен. По аналогии с фотоаппаратом, встроенным в телефон и standalone версией оного. Нужно проверять конечно.
Но преимущество внешнего движка в том, что его можно вынести на отдельный сервер и не грузить основной. Хотя конечно все зависит от объемов и частоты появления новых файлов. Если коллекция файлов статична, то разницы не будет.  

Всего записей: 2567 | Зарегистр. 20-06-2011 | Отправлено: 07:45 09-03-2014
xpin2013



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
XPerformer
Предложенное Вами решение справедливо для "Мегапорталов". Изучив скорость своего хука файловой системы (это разумеется абсолютно бесплатно), я не просто заметил феноменальную скорость. Я убедился, что быстрее отдача файлов не может происходить в принципе. Даже кэширование файловой системы не способно дать таких результатов. Я использовал собственный клиент датасет с локальной индексацией. Он полностью лежит в памяти, индексы работают по принципу сортированной вставки. Запросы к моим файлам не доходят до файловой системы, а сразу превращают блоб в TMemoryStream, который эмулирует движение позиции чтения по файлу. Так что для базы, соизмеримой с оперативной памятью сервера, такое решение более оптимально.  
 
Однако если требуется магапортал типа narod.ru, то естественно я бы предпочёл Ваше решение.

Всего записей: 291 | Зарегистр. 16-01-2014 | Отправлено: 08:54 09-03-2014
XPerformer



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
xpin2013
если честно ничего не понял, особенно "эмулирует движение позиции чтения по файлу"

Всего записей: 2567 | Зарегистр. 20-06-2011 | Отправлено: 09:01 09-03-2014
xpin2013



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
XPerformer
Дело в том что я перехватываю все функции файловой системы. Естественно при побайтном чтении, позиция в Вашем файле меняется. Есть функция файловой системы - изменить позицию без чтения хоть к началу хоть в конец. Будет проще если я покажу, извините без тэга more.
 

Код:
type
  TOldFileSystem = class(TObject)
  strict private
    FHooks: TJclPeMapImgHooks;
  private
    FCreateFileA: Pointer;
    FCreateFileW: Pointer;
    FGetFileAttributesA: Pointer;
    FGetFileAttributesW: Pointer;
    FFindFirstFileA: Pointer;
    FFindFirstFileW: Pointer;
    FFindNextFileA: Pointer;
    FFindNextFileW: Pointer;
    FFindClose: Pointer;
    FReadFile: Pointer;
    FSetFilePointer: Pointer;
    FCloseHandle: Pointer;
    procedure HookImportsForModule(ModuleBase: Pointer);
    procedure HookFileSystem(modulename: string);
    procedure UnhookFileSystem;
  public
    constructor Create;
    destructor Destroy; override;
  end;

 
Добавлено:
А вот примерно как может выглядеть обработчик пользователя компонента.  
Это всё что требуется уметь

Всего записей: 291 | Зарегистр. 16-01-2014 | Отправлено: 09:07 09-03-2014
XPerformer



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
xpin2013
Не уловил, какое это имеет отношение к обсуждаемой теме?

Всего записей: 2567 | Зарегистр. 20-06-2011 | Отправлено: 09:17 09-03-2014
xpin2013



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
XPerformer

Цитата:
Дилемма - где хранить файлы - как BLOB-ы в базе или в файловой системе, а в базе - ссылки на них? База используется с web-системой, под IIS.  

Я не совсем знаком с "База используется с web-системой, под IIS." Я думаю что эта web система копирует блобы в файл и отдаёт их IIS. Если не так поправте меня?
 
Да, добавлю, имел ввиду полнофункциональный IIS сервер со всеми прелестями сишарп WCF.

Всего записей: 291 | Зарегистр. 16-01-2014 | Отправлено: 09:20 09-03-2014 | Исправлено: xpin2013, 10:58 09-03-2014
Big17

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
xpin2013

Цитата:
Я не совсем знаком с "База используется с web-системой, под IIS." Я думаю что эта web система копирует блобы в файл и отдаёт их IIS. Если не так поправте меня?  

 
Да-да, именно так.  
Причем столкнулись с ситуацией, когда невозможно отдать файл больше 1 Гб в INSERT (из-за какие-то ограничений в IIS), хотя сам SQL Server легко проглатывает такие файлы в обычных запросах, не через IIS.
 
Это кстати, один из минусов хранения файлов в базе...

Всего записей: 147 | Зарегистр. 30-09-2003 | Отправлено: 11:01 09-03-2014
XPerformer



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Big17
если речь идет о гигабайтных файлах, то хранить в блобах уже просто не рационально. Eсли у вас " (все офисные, pdf, rtf, txt)" - по гигабайту, то вряд ли здесь найдете толковый совет, так как ситуация явно нетипичная

Всего записей: 2567 | Зарегистр. 20-06-2011 | Отправлено: 11:16 09-03-2014
xpin2013



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
XPerformer
Блобы по гигабайту - я и не предполагал. Извините, что Вас перебил.
 
Big17
Если интересуют блобы по 1 Гб и больше, то это неверный подход. Надо сразу отказаться от блобов. Представьте Ваша база длинной 200 Гб, неповоротливая, рухнет от одного сбойного сектора. Целиком рухнет, и что тогда??? Вы думаете, что найдётся средство её восстановить? Очень сомневаюсь, однако процент для того чтобы рухнуть такому монстру черезвычайно велик.
 
Посмотрите в сторону решений XPerformer

Всего записей: 291 | Зарегистр. 16-01-2014 | Отправлено: 15:47 09-03-2014
rrromano



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Есть еще момент сопровождения и администрирования. С одной стороны файлы в БД - лучше целостность. Но вот что делать с резервным копированием, например? Мне кажется, в каждом случае нужна индивидуальная оценка на этапе анализа и постановки задачи. С учетом перспектив развития системы.

Всего записей: 283 | Зарегистр. 20-09-2006 | Отправлено: 17:06 14-03-2014
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Где хранить файлы


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru