Ці павінен я захоўваць выявы ў маёй сістэме базы дадзеных або файла ў гэтым дадатку?

Я выкарыстоўваю ASP.NET MVC 4 і SQL Server 2012. У мяне няма ніякіх праблем, будзе для любога з гэтых рашэнняў, але я хачу ведаць, які з іх будзе адпавядаць лепш у канкрэтным дадатку я ствараю прама цяпер.

Я раблю выгляд прыкладання бібліятэчнай сістэмы. Адзіныя малюнка дадатак крамы:

  • Карыстальнікі Профіль фатаграфій (1 на аднаго карыстача)
  • Бібліятэкі Профіль фатаграфій (1 на бібліятэку)
  • фатаграфіі аўтараў кнігі (1 на аўтара)
  • вокладка кнігі малюнка (1 за кнігу)

Ні адно з малюнкаў, захаваных не павінны быць высокай якасці. Такім чынам, відавочна, што малюнка не з'яўляюцца вялікай часткай прыкладання і з улікам гэтага, я ў цяперашні час захоўвання малюнкаў у маёй базе дадзеных. Хоць я заўважыў нешта, што я думаю, што раблю для буйнога Конан.

Выявы атрыманы з дапамогай Url.ActionLink , што прыводзіць да спосабу дзеяння кантролера, які прымае (напрыклад) параметр BookID да дасягнення да базы дадзеных, атрыманне малюнка гэтай кнігі і адправіць яго назад. Такім чынам, калі карыстальнік быў шукаць для кніг і ён заканчвае тым, што атрымаў спіс кніг, разам з іх выявамі перад ім, там будзе новы выклік метады дзеяння, які здабывае малюнка і новы зварот у базу, для кожнага малюнка ў спісе.

Ці ёсць лепшы спосаб апрацоўкі гэтага? Ці павінен я перагледзець мае захоўваючы выявы ў базе дадзеных, або гэта не вялікая праблема?

EDIT: Ці не будзе разглядаць гэтае пытанне дублікат, таму што яна ставіцца да вызначанага тыпу прыкладання, якое апрацоўвае вельмі мала дадзеных выявы як у адрозненне ад любы тып прыкладання (напрыклад, у linked пытанне ). Вядома, калі вы не ведаеце, колькі дадзеных выявы вы збіраецеся быць захоўвання заўсёды лепш захоўваць выявы ў файлавай сістэме. Гэта не такі выпадак. Характар ​​адказаў тут у параўнанні з адказамі там паказвае гэта.

9
Перавага наяўнасці малюнкаў у файлавай сістэме з'яўляецца тое, што вы можаце служыць ім асобнай скрынкі з некаторым серверам больш лёгкі вага (і, такім чынам, хутчэй), як Nginx або Lighttpd. Але, вядома, гэта адкрывае магчымасці для праблем ўзгодненасці.
дададзена аўтар Vali Hutchison, крыніца
Разглядалі вы базу дадзеных NoSQL для гэтай мэты? Вы можаце быць у стане выкарыстаць базы дадзеных , які апрацоўвае гэты тып дадзеных эфектыўна, які дазволіць вы прытрымлівацца запытаў замест таксама змешванне ў доступе да файлаў.
дададзена аўтар user22815, крыніца
@Snowman Я думаю NoSQL сапраўды празмернасць для гэтага прыкладання. Улічваючы, я выкарыстоўваю Ef6, гэта толькі збіраецца зрабіць доступ да дадзеных больш складаным для мяне.
дададзена аўтар Alternatex, крыніца

5 адказы

Чаму б не зрабіць так? База дадзеных з'яўляецца падтрымка, канчатковы магазін для малюнка. Грамадскасці бок можа быць простым для чытання з БД, але вы можаце лёгка пашырыць, што ў кэш дыска для чытання праз, а таксама скарыстацца шматлікімі трукамі інфраструктуры для павышэння прадукцыйнасці лепш.

Выйгрышы тут:

  • simpler data backup -- database backups are fun and easy, no file system touching necessary
  • simpler dev story -- you don't need to handle a bunch of files, just get the dev team a copy of the database
  • easier to write the image -- file systems are a PITA, from permissions, to changing locations from dev->qa->production, to contention to lack of transactions. If the writes are going to the db then you solve 90% of those problems.
  • modern databases can handle it -- presuming we are talking fairly typical image file sizes measuring under a few megabytes most modern database systems can handle them very well. It is not the database murdering issue that some older articles would have you believe.
8
дададзена
Дзякуючы. Я не думаў, што далёка ўверх па стэку, але тая ж ідэя з дыскавым кэшам чытання праз можа быць ужыты да КДСУ, а таксама.
дададзена аўтар Mark Gibaud, крыніца
Збіраючыся выбраць гэты як адказ, але абодва адказу былі сапраўды карысныя пры прыняцці свайго рашэння. Натхнёны мяне дагэтуль лічаць захаванне малюнкаў у базе дадзеных сапраўдны спосаб захоўвання.
дададзена аўтар Alternatex, крыніца
<�Р> Такім чынам, калі карыстальнік быў шукаць для кніг і ён заканчвае тым, што атрымаў спіс кніг, разам з іх выявамі перад ім, там будзе новы выклік метаду дзеянні, які здабывае малюнка і новы зварот у базу, для кожнага малюнак у спісе. </р>

Я б выказаў здагадку, што гэта добрая рэч. Выявы зоймуць значна больш часу, чым для перадачы тэксту такім чынам, замест таго, каб чаканне карыстальніка як для загрузкі з базы дадзеных, вы можаце паказаць тэкст, а затым загружаць выявы асобна.

Акрамя таго, калі ваша прыкладанне калі-небудзь стаць паспяховым, вы можаце зрабіць свой запуск вэб-прыкладанняў на некалькіх серверах. Кожны сервер, у гэтай кропцы, мае доступ да базы дадзеных, але не ў файлавай сістэму іншага сервера.

Тым не менш, варта разгледзець магчымасць выдзялення выявы ў іх уласнай табліцы малюнка. Не захоўваць малюнак у той жа табліцы, што і кніга; проста захоўваць выявы ID і выкарыстоўваць яго для атрымання малюнка пазней. Гэта значна больш эфектыўна, улічваючы, як базы дадзеных, кіравання дадзенымі на дыску. Гэта зацвярджэнне значна больш важна, калі вы плануеце змяніць малюнак, звязанае з кнігай у любым пункце.

Нарэшце, мой досвед працы з гэтымі рэчамі, што вы будзеце вельмі хутка ударыў сітуацыю, калі вы хочаце выкарыстоўваць сетку дастаўкі кантэнту для захоўвання малюнкаў (гл AWS CloudFront або Azure CDN або CloudFlare), які на самай справе з'яўляецца лепшым з абодвух сьветаў - другаснае сховішча, можна атрымаць непасрэдна URL, нават не турбуючы дадатак - і не так шмат дадатковай працы. Пераход да CDN вельмі лёгка змяніць, калі вы ізалявалі вашыя выявы ў іх ўласную табліцу.

Ці, вы можаце проста пайсці на рашэнне CDN цяпер і ніколі больш не турбавацца пра гэта.

4
дададзена
@EsbenSkovPedersen: «Пераход да CDN» з'яўляецца «што» ў прапанове вы цытуеце ... можа быць, я павінен змяніць гэты радок.
дададзена аўтар fluffels, крыніца
«Гэта вельмі лёгка змяніць, калі вы ізалявалі вашыя выявы ў іх ўласную табліцу.» Што гэта трэба рабіць з CDN?
дададзена аўтар mkuse, крыніца
Мой пункт гледжання складаецца толькі, што пераход да CDN з'яўляецца лёгкае змена незалежна ад таго, дзе вы захоўваеце свае выявы.
дададзена аўтар mkuse, крыніца

Ёсць абгрунтаваныя асцярогі па абодва бакі дыскусіі, таму заўсёды ўлічваем вашыя патрабаванні і абмежаванні. Колькі дадзеных, колькі малюнкаў, як вялікі, як бяспечна, час аднаўлення?

Убудаваныя/захоўвання BLOB

перавернуты

  • Кантроль версій/ўзгодненасці транзакцый. Гэта ключ семантычнае адрозненне. Гэта апрацоўваецца добра БД, так што дазваляе ажыццявіць аднаўленне на пэўны момант часу. Файлавыя не забяспечваюць гэтага, так што вы не будзеце мець магчымасць адкату. (Я не маю на ўвазе файлавай сістэмы аўтаномнага, я маю на ўвазе праблему транзакцыйных кіравання з кода). Выявы і дакументы могуць быць пашкоджаны ў выніку карыстацкай памылкі або рассинхронизировались, стаўшы 2-фазны комм праблему. Некаторыя сістэмы вырашыць гэтую праблему шляхам дадання знешняй сістэмы кіравання версіямі, але гэта патрабуе інтэграцыі.
  • Спрашчае рэалізацыя
  • Усе дадзеныя прыкладанняў самадастатковая - Спрашчае рэзервовае капіяванне і аднаўленне або міграцыю сістэмы да тых часоў, як след блобы дадзеныя не з'яўляецца грувасткім; проста зрабіць дамп, рэзервовае капіраванне, экспарт (незалежна ад тэрміну вашага густу БД) і перамясціць яго ў новую базу дадзеных. Ніякіх знешніх файлаў для сінхранізацыі.
  • Бяспека/Кантроль доступу чысты; Доступ да BLOB малюнка з'яўляецца унутраным для доступу да радка дадзеных. Калі дакумент знаходзіцца па-за БД і хай сервер HTTP вазьміце яго (за межамі MVC дадатак), гэта можа быць лепш для паралелізму і маштабаванасці, але патрабуе больш сыходу, каб забяспечыць Аўтарызацыя прыкладваецца да знешніх файлаў, паколькі яны з'яўляюцца DB дадзеныя. Я правераныя праекты, дзе вялікія файлы былі захаваныя з лініі, у статычных, ушчыльненай URL-адрасы, і мой першы сцэнаром тэсту з'яўляецца спробай прамога доступу да статычнай URL без аўтэнтыфікацыі. Калі вы робіце дом абароненых дакументаў за межамі БД, ня служэце ім статычны, і пераканайцеся, што палітыка бяспекі ахоплівае кантроль доступу малюнкаў паміж жыхарамі. Аўтэнтыфікацыя Вашага HTTP сервер павінна інтэграваць з аўтэнтыфікацыяй агульных сістэм. Гэта вялікая праблема ў базах дадзеных шматкарыстальніцкіх. Менш турботы ў адной мэты, аднакарыстальніцкіх сістэм з простай аўтэнтыфікацыі.
  • Зніжэнне Database Server Surface Area - У многіх сістэмах БД асобна ад сервера прыкладанняў, і ёсць брандмаўэр паміж імі. Усё, што можа быць пададзены праз адзін порт DB (1433/MSSQL) або (тысячу пяцьсот дваццаць адна/Oracle) у якасці прыкладу. З файламі, пры перамяшчэнні БД на асобны ўзровень, вы павінны выкарыстоўваць NFS або NAS ці як капіяваць файлы паміж серверам прыкладанняў, калі вы маштабавацца.

ніжняя бок

  • Рэзервовае капіраванне раз - Для сапраўды вельмі вялікіх баз дадзеных (не ставіцца да вас), рэзервовае капіяванне і аднаўленне атрымлівае расчараванне і пачынае станавіцца праблематычным і дарагім; у той час як вы можаце мець невялікі асноўны набор дадзеных у адваротным выпадку, вы можаце мець шмат ГБ або Тб дадзеных малюнка. Лячэнне за ўсё гэта як адну паслядоўнай базы дадзеных і добра, з пункту гледжання цэласнасці, але дрэнна для рэзервовага капіявання і аднаўлення, калі не выкарыстоўваць DBMSes з рэзервовым капіяваннем і аднаўленнем карпаратыўнага ўзроўню (прыклад Oracle RMAN і пракатныя копіі, EMC BCVs або Netapp фотаздымка). На аднаго кліента, наша БД стала настолькі вялікі, мы проста перасталі падмацоўваючы яе і імкнемся да геаграфічна залішнія рэплікам. Іншы добра вядомы выпадак быў Starbucks (Абд паклаў паперу ў Інтэрнэце, гэта цікава чытаць, калі вы ў гэтым).
  • Час аднаўлення (ака Recovery Time Objective або аднаўленне SLA) - гэта часта вызначаецца вашым кліентам. Як DBA вы павінны вярнуцца ў тым, што калі кліент ужо заявіў так. Пры даданне 90% да памеру базы дадзеных для захоўвання неабароненых малюнкаў, уплывае на аднаўленне ОАСА крытычных дадзеных, то не рабіце гэтага.
  • Менш гнуткасці. Не проста атрымаць доступ да дакументаў з ўтылітамі ўзроўню АС, каманд абалонкі і г.д.

Асабіста, у гэтым кантэксце, я думаю, што вагі ўкладаецца ў карысць захоўвання рядного DB. Калі ваша БД не вялікі, трымаць усё гэта ў БД.

4
дададзена
Для файлавай сістэмы кантролю версій, вы можаце паглядзець ZFS, ці лічаць, што мярзотнік таксама filesyetem гатункаў.
дададзена аўтар user40980, крыніца
@MichaelT Вядома, я ведаю ўсё пра іх і выкарыстаў як, сярод іншых варыянтаў, як VxFS/VxLVM. Яны забяспечваюць сапраўдную карысць. Але яны ўсё яшчэ знешнія па адносінах да БД. Вы павінны інтэграваць іх, калі вы хочаце агульную ўзгодненасць транзакцый і перагляду кантролю. Маючы гэта ў сінхранізацыі з транзакцыяй базы даных уяўляе сабой 2-фазную фіксацыю праблемы. Іншымі словамі, вы не можаце лёгка «прыняць або адкаціць» ZFS як частка агульнай транзакцыі базы дадзеных.
дададзена аўтар Sebastian, крыніца

Раю супраць захавання малюнкаў у базе дадзеных.

Гэта не тое, што база дадзеных прызначана для - гэта не рэляцыйныя дадзеныя, ставіцца да іншых дадзеных. Гэта лёгка займае вельмі шмат месца і цяжка маніпуляваць, калі ў Стоўбцах двайковых аб'ектаў базы дадзеных.

I use databases to store the name, timestamps, meta data and file location. I then store and access the image at that file location/name

Я прайшоў праз гэта некалькі гадоў таму ў рэальным свеце, і разам з многімі іншымі, прыйшоў да высновы, што захоўванне малюнкаў у базе дадзеных быў дрэнны падыходам. Для версій і гісторыі проста код з ўзорамі, якія захоўваюцца ў сістэме кіравання версіямі і кіраваць імі, як з любой іншай. Такім чынам, змяніць імя для кожнага малюнка, дата выкарыстання штампаў і ня паўторна выкарыстоўваць дакладна такое ж імя файла для іншага малюнка.

Многія людзі, якія пачынаюць ад падчас гэтага прыйдзецца галоўны выключальнік праз некаторы час, як іх база дадзеных становіцца занадта вялікім з-за ўсіх малюнкаў. Гэта аказвае ўплыў пульсацыі на патрэбы захоўвання дадзеных, сервераў, КПУ і, магчыма, сеткавага трафіку. Гэта таксама робіць яго больш цяжкім выкарыстоўваць воблака захоўвання дадзеных на базе файлавай сістэмы, якая можа прымаць да ўвагі геаграфічнае становішча, руху і да таго падобнае. Гэтыя метады становяцца крытычнымі па меры росту кампаніі і якія маюць выявы ў базе дадзеных, можа сур'ёзна абмежаваць вашы варыянты.

У зняволенні, добра для невялікіх праектаў з невялікай колькасцю дадзеных малюнка. Не падыходзіць для вялікіх магазінаў або вялікіх аб'ёмаў дадзеных.

3
дададзена

Калі вы карыстаецеся SQL Server (2008 ці за яе межамі) вы можаце захоўваць іх у базе дадзеных як згусткі або з дапамогай FILESTREAM. Як і іншыя commentors паказалі, я не пайшоў бы з propertiery захаваць яго на свой дыск падыходзе, вам давядзецца кіраваць сумессю ў гэтым сцэнары.

Добрая спасылка на FILESTREAM можна знайсці тут:

FileStream Рэкамендацыі </а >

Некаторыя агульныя правілы:

<�Р> У SQL Server, двайковыя аб'екты могуць быць стандартным VARBINARY (макс) дадзеныя, якія захоўваюць   дадзеныя ў табліцах, або FILESTREAM VARBINARY (макс) аб'екты, якія захоўваюць   дадзеныя ў файлавай сістэме. Памер і выкарыстанне дадзеных вызначае,   ці павінны вы выкарыстоўваць для захоўвання базы дадзеных або захоўванне файлавай сістэмы. Такім чынам, у   Карацей кажучы, гэта тыповыя сцэнары, у якіх гэтая функцыя з'яўляецца лепшым   падыходзіць: </р>      
      
  • Пры захоўванні аб'ектаў BLOB з сярэднім памерам 1 МБ або   больш.
  •   
  • Калі хуткі доступ для чытання непахісны.
  •   
  • Калі вы павінны атрымаць доступ да BLOB-кода ад сярэдняга ўзроўню прыкладання.
  •   
     <�Р> У цэлым, асноўныя перавагі выкарыстання FILESTREAM у параўнанні з іншымі варыянтамі з'яўляюцца:      
      <�Літый> Захоўванне і выманне двайковых аб'ектаў вырабляюцца разам з рэляцыйнымі дадзенымі ў адным   сховішча дадзеных.   
  • Так, BLOB-ўключаны ў рэзервовыя копіі базы дадзеных і аднаўлення.
  •   
  • Усталёўка, абнаўленне і выдаленне аб'ектаў BLOB і рэляцыйных дадзеных адбываецца ў адной і той жа транзакцыі базы дадзеных.
  •   <�Літый> 2-ГБ максімальны памер для слупка VARBINARY (макс) не ўжываецца; Вы абмежаваныя толькі вольная прастора ў файлавай сістэме NTFS.   
  • Памяць пула буфераў SQL Server не выкарыстоўваецца для працы з BLOB-; ў папярэдніх версіях вялікіх аб'ектаў BLOB можа спажываць шмат гэтай памяці.
  •   
  • Усе доступ BLOB можа быць выкананы з кода .NET, дазваляючы сярэдні код ўзроўню лёгка працаваць з гэтымі аб'ектамі.
  •   
  • Файлавая сістэма NTFS можа захоўваць і здабываць вялікія двайковыя аб'екты больш эфектыўна, чым SQL Server.
  •   
     <�Р> Тым не менш, некаторыя пастаўленыя абмежаванні на рэалізацыі FILESTREAM:      
      Функцыя
  • FILESTREAM не падтрымліваюцца з люстраным адлюстраваннем базы дадзеных.
  •   кантэйнеры
  • FILESTREAM дадзеныя не могуць сумесна выкарыстоўваць адзін і той жа каталог, або радком.
  •   
  • FILESTREAM дадзеныя не шыфруюцца, нават калі празрыстае шыфраванне дадзеных (TDE) уключана.
  •   

2
дададзена