Consiglio su salvataggio in db di immagini

mercoledì 28 novembre 2012 - 11.26
Tag Elenco Tags  VB.NET  |  .NET 4.0  |  Windows Server 2008  |  Visual Studio 2010

trinity Profilo | Guru

ragazzi mi servirebbe un vostor consiglio....ho creato una scheda clienti in web con sql server 2008 in uqesta scheda vi sono due campi che deve contenere una l'imamgine del cliente ed una eventuale logo azienda...dato che i clienti potrebbero essere oltre 3000 ho pensato di salvare la path dove si trova l'immagine ed uplodare la stessa immagine sul server in modo tale da rendere il db leggero e non grande...oppure mi consigliate di salvare l'immagine in un campo binario o image del db?

Ciao
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

ratum99 Profilo | Junior Member

>ragazzi mi servirebbe un vostor consiglio....ho creato una scheda
>clienti in web con sql server 2008 in uqesta scheda vi sono due
>campi che deve contenere una l'imamgine del cliente ed una eventuale
>logo azienda...dato che i clienti potrebbero essere oltre 3000
>ho pensato di salvare la path dove si trova l'immagine ed uplodare
>la stessa immagine sul server in modo tale da rendere il db leggero
>e non grande...oppure mi consigliate di salvare l'immagine in
>un campo binario o image del db?
>
>Ciao
>Cirillo Fabio

Dalla mia esperienza, consiglio vivamente di non salvare le immagini nel DB per vari motivi.
Sicuramente il più importante è che gestire un DB di grandi dimensioni è molto più difficoltoso di gestire una cartella con tante immagini.
Poi di solito gli host ti danno dimensioni limitate per il DB mentre MB "illimitati" per lo spazio.

DomA Profilo | Expert

>> ho pensato di salvare la path dove si trova l'immagine ed uplodare la stessa immagine sul server

credo proprio che questa sia la strada giusta per almeno due motivi:
1) un db più snello dovrebbe essere più veloce da caricare
2) all'umentare delle dimensioni del db aumentano i costi (almeno questa è la politica di molti provider)

......................................................................................


Ricorda che, accettare la risposta è un modo di ringraziare chi ci ha aiutato ed evidenziare che il problema è stato risolto.

http://www.infomidia.it

Domenico

alx_81 Profilo | Guru

>>> ho pensato di salvare la path dove si trova l'immagine ed uplodare la stessa immagine sul server
Ciao, questo è un annoso problema ed è possibile affrontarlo con innumerevoli soluzioni.
Dipende molto anche da cosa devi fare e da come lo vuoi fare.
Mi spiego meglio.. Innanzitutto, il caricamento dei dati deve essere sincrono e transazionale? Se l'immagine non si carica il record deve essere salvato? E, in caso contrario, cosa deve succedere nel momento in cui qualcosa non va?
In secondo luogo, devi fare versionamento delle immagini? Oppure si tratta solamente di due binary e stop?
Infine, ma non di certo per importanza.. Vuoi fare in modo che i tuoi backup portino con sè anche le immagini?
Parlando poi di licenze.. Che versioni di SQL Server hai (se non ricordo male hai SQL Server no?).

SQL Server appunto, a partire dalla versione 2008, ti dà il FILESTREAM, che è un'opzione (servizio anche) che ti isola una cartella e pone le immagini salvate "direttamente" su database, evitandoti l'utilizzo di campi BLOB. In poche parole, utilizzando FILESTREAM, avrai tutto incluso nel db senza dover parlare di campi speciali e il backup restore plan conterrà anche gli stream ottimizzati ed opportunamente organizzati. Leggi qui per maggiori info: http://technet.microsoft.com/it-it/library/bb933993(v=sql.100).aspx
Quando è consigliato usarli?
- Gli oggetti che si stanno archiviando sono, in media, più grandi di 1 MB.
- La rapidità dell'accesso in lettura è importante.
- Si stanno sviluppando applicazioni che utilizzano un livello intermedio per la logica dell'applicazione.

Ovviamente se devi gestire letture posizionali (e non scan o liste di utenti nel tuo caso) e i file immagine sono veramente piccoli (e lo rimangono SEMPRE) puoi anche usare i BLOB (varbinary(MAX)) ma non utilizzare image/text che sono deprecati.

Il gestire la cartella, a volte può essere più comodo, ma la manutenzione è decisamente più impegnativa, e pure la transazionalità ti obbliga a passare dal filesystem, con il conseguente collo di bottiglia dello storage e il problema della gestione delle risorse allocate (da disallocare).
Seppure la strada delle cartelle sia comunque non malvagia, considera anche il FILESTREAM e in generale il blob, soluzione che molto spesso è sottovalutata, ma in certi casi, è forse la più efficace. Se devi leggere, per esempio, 50k tra le due immagini, di un solo record, a mio avviso il BLOB è una buona prassi. Se devi leggere 3000 righe x 50K, già l'approccio non aiuta (se le leggi massive) e con filestream hai velocità in lettura continuando a tenere all'interno del tuo database i dati delle immagini.
Sulla base di questo, effettua la tua analisi e vedi quale metodo calza di più alla tua casistica.
Ciao
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.microsoft.com/profiles/Alessandro.Alpi

trinity Profilo | Guru

Ciao, allora nel parlammo anche in un altro post...in pratica si tratta del db in cui devo salvare gli utenti che si registrano sul sito del mio cliente. Purtroppo l'immagine che uplodano può superare anche 1mb anche perchè non so in asp come poter fare un controllo e dire se l'immagine deve essere massimo di una grandezza che stabilisco io. Comuqnue i record possono essere tanti veramente tanti e poi su tale record io devo esere anche delle ricerche con relativo caricamento dei record selezionati che a loro volta avranno l'immagine da caricare...esempio è capace che il mio cliente vuole visualizzare la lista degli utenti registrati della città di roma e in questo caso la ricerca deve essere veloce ed il risultato a video potrebbe essere di centinaia di record...In altre parole devo calcolare la ricerca e visualizzazione da un singolo record a decine di record...Allora avevo pensato di creare nella tabella degli utenti per ogni record un campo varchar nel quale andavo a salvare semplicemente il percorso del file uplodato sul server web remoto e di conseguenza quando andavo a caricare il record o i record si prende la path salvata caricando la relativa immagine....Io dispongo di sql server 2008 ma non è mio è quello che offre il provider dove girerà il sito web, ovviamente non avendo un server dedicato devo calcolare anche la grandezza del Db che più aumenta e più avrò un costo da sostenere, in quanto il provider ti offre una grandezza standard...In futuro se il progetto prenderà piede avremo un nostro server dedicato e li posso divertirmi di più...Ora devo pensare alla stabilità e velocità nel caricare le immagini...Per quanto riguarda il caricamento dell'immagine quella avviene sempre insieme ai dati, se l'utente non ha messo una sua immagine personale, di default viene caricata una standard offerta da noi...

Ecco il quadro generale, in base a questo cosa mi consigli? Continuare con il mio metodo oppure utilizzare il filestream (se dovessi utilizzare questa strada hai qualche esempio da farmi vedere?)

ah dimenticavo alx_81 so se non ricordo male che ancge tu conosci i comandi telerik ecco un link di come vorrò far visualizzare i record ricercati: http://demos.telerik.com/aspnet-ajax/listview/examples/templates/datalayouttemplates/defaultcs.aspx



Ciao e grazie
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

alx_81 Profilo | Guru

>Ecco il quadro generale, in base a questo cosa mi consigli? Continuare
>con il mio metodo oppure utilizzare il filestream (se dovessi
>utilizzare questa strada hai qualche esempio da farmi vedere?)
come ti dicevo:
Quando è consigliato usarli?
- Gli oggetti che si stanno archiviando sono, in media, più grandi di 1 MB.
- La rapidità dell'accesso in lettura è importante.
- Si stanno sviluppando applicazioni che utilizzano un livello intermedio per la logica dell'applicazione.

però se il db non è tuo, mi sa che ti devi attaccare. Non so se il provider supporta l'installazione di quel servizio.

--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.microsoft.com/profiles/Alessandro.Alpi

trinity Profilo | Guru

Appunto allora procederò per questa strada ossia salvo nel db la path dell'immagine e il file dell'immagine l'uplodo in una cartella passando poi alla apgina web imageurl del file prendendolo dal db..appena il progetto e lo spero, decolla allora prendo un server dedicato ci installo sql server 2008 mio con il servizio filestream e gestisco il tutto come mi hai consigliato..

Ciao e grazie
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

DomA Profilo | Expert

alx_81 complimenti per la risposta cosù ben articolata e grazie per il link su "FILESTREAM"

------------------------------------------------

http://www.infomidia.it

Domenico

alx_81 Profilo | Guru

>alx_81 complimenti per la risposta cosù ben articolata e grazie
>per il link su "FILESTREAM"
aahah, grazie a te
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.microsoft.com/profiles/Alessandro.Alpi
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5