Плюсове и минуси на съхраняване на файлове (снимки) в SQL Server за уебсайт

Създавам уебсайт на Asp.Net MVC.

В миналото, за тежко приложение, многослойно приложение, използвах базата данни за съхраняване на файлове.

Но сега се питам дали това е добра идея за уебсайт? В изглед на изпълнение?

За мен има няколко плюса:

  • Позволява ми лесно да контролирам дали свързаният потребител има право да показва изображението (Изисква се за моя проект)
  • Позволява да сме сигурни, че имаме последователни данни (в противен случай можем да имаме съществуващ файл, но без информация в базата данни и обратното
  • Имам нужда от отказващ уеб сървър и тези файлове ще бъдат импортирани от трети сървър, така че ако тези файлове са в базата данни, трябва само да имам работещ ASP.Net уебсайт и репликирана база данни на сървъра за отказ, няма нужда за синхронизиране на файлове.

Но има и някои минуси:

  • Има НЯКОЛКО големи файлове (това е малцинство, но ще се случи), като 100-200MB, и не съм сигурен дали е добре да имам такъв тип файл в база данни? (това е по-скоро като въпрос ;) )
  • Не съм сигурен, че ще има добри изпълнения?

Какво мислиш? Това разумно ли е? Търсих в интернет, но не намерих някакви аргументи за уебсайт. Въпросът ми е предимно за FILESTREAM VS FILESYSTEM, сигурен съм, че FileStream е по-бавен, но много? Защото ако е само някакъв процент, печалбата от функционалност си заслужава.


person J4N    schedule 05.01.2012    source източник
comment
200Mg е малък брой, обикновено достигат 2G+.   -  person Aristos    schedule 05.01.2012


Отговори (3)


Ако файловете са неразделна и активно променяща се част от системата и те трябва да бъдат архивирани заедно с другите данни - можете да ги съхранявате в DB, ​​но опитайте да използвате полетата FILESTREAM, ако използвате sql сървър 2005+ и вашите файлове са достатъчно големи - да речем 500k+

Ако файловете са със статично съдържание, можете да ги съхранявате навън само с указатели в DB. Това не пречи да вземете предвид всичките си персонализирани разрешения на машината.

Съхраняването и работата с файлове в DB обикновено е по-бавно, отколкото във файловата система, но всичко зависи от вашите нужди.

person Oleg Dok    schedule 05.01.2012
comment
В моя случай това са наистина бизнес данни, които няма да се променят много (+10-20 файла (0,5 до 200 MB, повечето от файловете ще бъдат 2-3 месеца) професионална седмица). Знаете ли колко използването на файлов поток е по-бавно от използването на файлова система? - person J4N; 05.01.2012
comment
ПРАВИЛНО използването на файлов поток НЕ е по-бавно от използването на файлова система, DB е малко по-бавно, когато съхранявате файлове в чисти varbinary(max) колони - person Oleg Dok; 05.01.2012
comment
Ако имате нужда тези бизнес данни винаги да са в синхрон с други данни, особено в случай на операции за архивиране/възстановяване - трябва да запазите тези файлове в DB - person Oleg Dok; 05.01.2012
comment
Благодаря ви, имате ли връзка с общи неща, с които трябва да внимавате, когато използвате файлов поток? - person J4N; 05.01.2012
comment
Общите неща са... Две! 8-) Не актуализирайте частично записите на файловия поток и дори не докосвайте директно основните му файлове 8-) - person Oleg Dok; 05.01.2012

Има една наистина добра статия от Microsoft Research, наречена To Blob or Not To Blob.

Тяхното заключение след голям брой тестове и анализи на ефективността е следното:

  • ако вашите снимки или документ обикновено са с размер под 256K, съхраняването им в колона VARBINARY на база данни е по-ефективно

  • ако вашите снимки или документ обикновено са с размер над 1 MB, съхраняването им във файловата система е по-ефективно (и с атрибута FILESTREAM на SQL Server 2008 те все още са под транзакционен контрол и са част от базата данни)

  • между тези две, това е малко хвърляне в зависимост от вашата употреба

Ако решите да поставите вашите снимки в таблица на SQL Server, силно бих препоръчал да използвате отделна таблица за съхраняване на тези снимки - не съхранявайте снимката на служителя в таблицата на служителите - дръжте ги в отделна таблица. По този начин таблицата Employee може да остане стройна, подла и много ефективна, ако приемем, че не винаги е необходимо да избирате и снимката на служителя като част от вашите заявки.

За файлови групи вижте Архитектура на файлове и файлови групи за въведение. По принцип или ще създадете вашата база данни с отделна файлова група за големи структури от данни още от самото начало, или ще добавите допълнителна файлова група по-късно. Нека го наречем „LARGE_DATA“.

Сега, когато имате нова таблица за създаване, която трябва да съхранява VARCHAR(MAX) или VARBINARY(MAX) колони, можете да посочите тази файлова група за големи данни:

 CREATE TABLE dbo.YourTable
     (....... define the fields here ......)
     ON Data                   -- the basic "Data" filegroup for the regular data
     TEXTIMAGE_ON LARGE_DATA   -- the filegroup for large chunks of data

Вижте въведението на MSDN за файлови групи и си поиграйте с него!

person marc_s    schedule 05.01.2012
comment
В моя случай то ще се съхранява във файлова таблица, само с някои метаданни (име, размер), така че предполагам, че мога да запазя това поле в същата таблица. Давате ми много добри коментари, но всъщност не ми помага да избирам между файлов поток и файлова система, тъй като вашата връзка сравнява BLOB срещу файлова система (много поучително BTW). - person J4N; 05.01.2012

Защо да използвате db вместо txt файлове? Тъй като е по-бърз, той използва индекси. Съхраняването на цели файлове в db никога не е добра практика. Използвайте db като индекс (указатели) към нормалните img файлове.

Що се отнася до вашите плюсове / минуси:

  • можете лесно да контролирате дали потребителят има право да вижда изображението, ако покажете изображението с asp / php и зададете основна папка с изображение извън уеб корен

  • съхраняването на цели файлове в db е около 10 пъти по-бавно (знам за тестването на mysql, но е подобно за mssql - http://blog.sitek.com.au/2008/03/comparison-between-storing-imagesfiles-in-mysql-and-on-filesystem/)

  • ако имате файлове в db, няма да можете да използвате CDN (http://en.wikipedia.org/wiki/Content_delivery_network)

person Miha Trtnik    schedule 05.01.2012
comment
Благодаря ви за страхотните аргументи. Но смятам, че има голяма разлика между MySql и MS Sql, MS SQL има тип FILESTREAM, който (не съм експерт) се предполага, че е много по-ефективен от BLOB поле. (и в моя случай тези файлове са достъпни само за регистрирани-валидирани-потребители (това са бизнес неща, само тук за един процес, така че никога няма да бъдат достъпни чрез CDN) - person J4N; 05.01.2012
comment
Здравей Миха, можеш ли да разясниш малко повече за Използване на db като индекс (указатели) към нормалните img файлове.. Искаш да кажеш да съхраняваш изображенията си физически на диска в директорията на win и да съхраняваш пътя в DB? - person Alok; 05.01.2012
comment
@Alok - В повечето случаи е най-добре да използвате таблица за съхраняване на данни за изображения (заглавие, идентификатор, тип и т.н.), за да можете бързо да намерите изображението, което искате, и да съхранявате физическо изображение във файловата система. Тук има добра дискусия за това: stackoverflow.com/questions/3748/ - person Miha Trtnik; 05.01.2012