Newsgroup: it.comp.java
Titolo: immagini nel db?

ciao
un'applicazione che deve memorizzare delle immagini, è più flessibile se 
queste ultime le memorizza in un db con le info relative o in una 
cartella separata?
grazie

il 08.04.2010 0.24, Scrive MrX 43593480:

Mi piacerebbe dibattere su questo argomento, ma probabilmente il termine 
"flessibile" dipende molto dal contesto.
Ad esempio, prendi un'applicazione web che in base ai parametri di una 
form debba produrre una lista di contenuti associabili ad un'immagine. 
Quando l'utente sceglie una delle righe, si aspetta che l'immagine 
associata venga visualizzata. Dal lato server, quindi, possono succedere 
due cose (ovviamente sono solo ipotesi di possibili scenari):
a) l'immagine e' attesa in un campo blob:
il server legge il blob dal db e la scrive pari-pari nel servlet 
OutputStream, non deve fare alcun controllo di consistenza poiche' 
presumibilmente dalle righe pubblicate ricava la chiave per accedere al 
record contenente il campo blob, e presumibilmente c'e' un vincolo 
referenziale nel db che ne garantisce la consistenza.
b) l'immagine e' attesa in una cartella
il server deve controllare che l'immagine esista, la cartella deve 
essere accessibile dalla servlet che valuta la request (e qui possono 
sorgere i primi problemi: l'application server potrebbe vietare 
l'accesso ad una cartella fuori contesto) il file-immagine potrebbe 
essere stato cancellato/ridenominato/modificato per cui l'immagine 
potrebbe risultare inaccessibile o contenere dei dati che non 
corrispondono alla sua descrizione, poi il server deve leggere 
l'immagine (e qui potrebbero sorgere ulteriori problemi di accesso: il 
file-system potrebbe vietare l'accesso per intervenute modifiche sulla 
proprieta' o autorizzazioni sul file) e scriverla nel servlet 
OutputStream o gestirsi uno deigli eventuali errori dovuti a variazioni 
sul file-system che corrompono la consistenza che non puo' essrere 
garantita altrimenti.
Per cui, secondo questo tipo di logica la soluzione a) risulta piu' 
flessibile. Ovviamente se invece valuto l'aspetto di poter modificare le 
immagini, la soluzione a) risultera' meno flessibile poiche' 
indubbiamente e' piu' semplice utilizzare il copia/incolla su 
file-system piuttosto che aggiornare un blob su un db.

 o in una cartella separata?
Questa tematica esula da Java. La risposta dipende da molti fattori da 
considerare caso per caso, in sede di analisi.
Quando le immagini sono tante, decine di migliaia per intendersi, il 
file system non è la soluzione più adatta. Cartelle con decine di 
migliaia di files sono difficili da gestire, e da remoto comportano 
pesanti lag di trasmissione a causa dei sincronismi. Inoltre, la loro 
gestione e' molto complessa se ti trovi all'interno di uno o più 
domini, qui poi entrano in gioco le autorizzazioni, i permessi, i 
privilegi ecc...
Per quantità enormi di files, sconsiglio assolutamente il file system.
I contenuti multimediali occupano sempre tanto spazio, non mi riferisco 
alla classica jpg ma a scansioni, radiografie, foto raws, filmati, ecc. 
Nel momento in cui li memorizzi su database, i problemi sui quali 
impattano maggiormente sono sui tablespaces, più in generale sulle 
tabelle che li contengono. Se crei tabelle con BLOB e dati insieme, 
diventa critico quando aumenta la size e la popolazione della tabella: 
rischi di avere pesanti lag per recuperare solo i metadati.
Un altro limite, ma qui ci addentriamo in tematiche da DBA, è la size 
della pagina deputata al LOB: deve essere attentamente stimata per 
evitare perdite di spazio e di performances.
Ovviamente devi distinguere nell'analisi quale sia il contesto preciso 
dove vai a gestire i LOB, in linea di massima se hai quantità enormi e 
size enormi, e puoi federare il database, allora metti tutti i LOB in 
un db a parte e i dati e il resto in un altro database.
I dati/metadati dovrebbero essere reperibili in tempi rapidissimi, e 
lasciare il grosso del tempo nel recupero del solo LOB.
Consigli del genere te ne possono dare tanti. l'importante e' che fai 
una buona analisi a monte che ti fa capire in che terreno ti stai per 
muovere, quanti files, di che tipo, quanto grossi, ecc..
Ciao
-- 
Morde



l'unica ragione per non salvare i file immagini nel file system è quando 
non si hanno permessi per farlo. 

 
Ma anche quando ad averceli ci sono in troppi! :-))