Memorizzare le immagini come file o nel database per un'app Web?


124

La mia domanda è abbastanza generica e so che potrebbe non esserci una risposta al 100%. Sto costruendo una soluzione web ASP .NET che includerà molte immagini e, si spera, una discreta quantità di traffico. Voglio davvero ottenere prestazioni.

Devo salvare le immagini nel database o nel file system? E indipendentemente dalla risposta, mi interessa di più il motivo per cui scegliere un modo specifico.

Molte grazie, Stefan

DUPLICATO : Memorizzazione di immagini in DB - Sì o no? , Come memorizzare le immagini nel tuo filesystem , Memorizzare un piccolo numero di immagini: blob o fs? e probabilmente alcuni altri.


COMMENTO: Grazie per molte buone risposte. Sceglierò una soluzione basata su file anche se mi piace l'idea di avere una soluzione basata su database al 100%. Sembra che oggi ci siano buone soluzioni per fare ciò che voglio con i database, ecc., Ma ho alcuni motivi per non farlo.

  • Sarò su una soluzione ospitata, ho un'enorme quantità di spazio di archiviazione (10 GB) ma solo 300 MB per il database. Costerà molto per lo spazio di archiviazione aggiuntivo nel database.

  • Non sono un esperto di DB e nemmeno ho il controllo delle impostazioni del DB. Una soluzione basata su DB potrebbe richiedere una configurazione personalizzata come sembra.

Se ci trasferiremo per eseguire il sito sul nostro server, potrei considerare una soluzione basata su DB. grazie, Stefan


1
Specifica il database che stai utilizzando.
Gerrie Schenck,

1
Ho intenzione di utilizzare MSSQL della versione successiva.
StefanE

1
@StefanE, Il filesystem è, a tutti gli effetti, un database specializzato ottimizzato per l'archiviazione di file.
LukeH

Risposte:


175

Memorizzare le immagini nel file system e le posizioni delle immagini nel database.

Perché? Perché...

  1. Sarai in grado di servire le immagini come file statici.
  2. Non sarà richiesto l'accesso al database o il codice dell'applicazione per recuperare le immagini.
  3. Le immagini potrebbero essere fornite da un server diverso per migliorare le prestazioni.
  4. Ridurrà il collo di bottiglia del database.
  5. Il database alla fine memorizza i suoi dati sul file system.
  6. Le immagini possono essere facilmente memorizzate nella cache quando sono archiviate nel file system.

1
Inoltre, in SQL Server, quando si archivia l'immagine come campo "Immagine", questo è effettivamente ciò che fa SQL: memorizzare un puntatore al file su disco da qualche parte. Questo è il modo in cui aggira il limite di 8 KB di pagina.
Zhaph - Ben Duguid

9
Questo in realtà è stato affrontato è SQL Server 2008. È stato introdotto un nuovo tipo FILESTREAM technet.microsoft.com/en-us/library/bb895234.aspx che consente di sfruttare "le prestazioni del file system e allo stesso tempo mantenere coerenza transazionale tra i dati non strutturati e i corrispondenti dati strutturati "
kristof

Sì, hai ragione. la mia domanda è qual è la dimensione del blob? o quanta memoria può immagazzinare?
Ameer

11

Nei miei progetti sviluppati di recente, ho memorizzato le immagini (e tutti i tipi di documenti binari) come colonne di immagini nelle tabelle del database.

Il vantaggio di avere file archiviati nel database è ovviamente che non si finisce con file non referenziati sul disco rigido se un record viene eliminato, poiché la sincronizzazione tra database (= metadati) e disco rigido (= archiviazione file) non è integrata e deve essere programmato manualmente.

Utilizzando la tecnologia odierna, ti suggerisco di memorizzare le immagini nelle colonne FILESTREAM di SQL Server 2008 (almeno questo è quello che farò con il mio prossimo progetto), poiché combinano il vantaggio di memorizzare i dati nel database E di avere binari di grandi dimensioni in file separati (a almeno secondo la pubblicità;))


Hai già testato la funzionalità Filestream?
StefanE

1
In realtà, quando si elimina un record DB, può essere codificato per eliminare anche dal filesystem. Quindi trovo utile archiviare in FS anziché in DB
kailash19

9

L'adagio è sempre stato "File nel filesystem, metadati dei file nel database"


6

Meglio archiviare i file come file. Diversi database gestiscono i dati BLOB in modo diverso, quindi se devi migrare il tuo back-end potresti avere problemi.

Quando si servono le immagini un <img src = a un file che già esiste sul server è probabile che sia più veloce che creare un file temporaneo dal campo del database e puntare il tag <img a quello.

Ho trovato questa risposta cercando su Google la tua domanda e leggendo i commenti su http://databases.aspfaq.com/database/should-i-store-images-in-the-database-or-the-filesystem.html


1
il post segnalato sembra un po 'datato.
devio

6

di solito mi piace avere file binari nel database perché:

  • integrità dei dati: nessun file senza riferimenti, nessun percorso nel db senza alcun file associato
  • coerenza dei dati: fai un dump del database e questo è tutto. no "O mi sono dimenticato di targzare questa directory di dati."

4

L'archiviazione delle immagini nel database aggiunge un sovraccarico del DB per servire singole immagini e rende difficile l'offload dello storage alternativo (S3, Akami) se si sale a quel livello. Memorizzarli nel database rende molto più semplice spostare la tua app su un server diverso poiché è solo il DB che deve essere spostato ora.

L'archiviazione delle immagini sul disco semplifica l'offload per l'archiviazione alternativa, rende le immagini elementi statici in modo da non dover scherzare con le intestazioni HTTP nella tua app Web per rendere le immagini memorizzabili nella cache. Lo svantaggio è che se sposti la tua app su un server diverso, devi ricordarti di spostare anche le immagini; qualcosa che si dimentica facilmente.


3

Per le applicazioni basate sul Web, otterrai prestazioni migliori dall'utilizzo del file system per l'archiviazione delle immagini. Ciò consentirà di implementare facilmente la memorizzazione nella cache delle immagini a più livelli all'interno dell'applicazione. Ci sono alcuni vantaggi nell'archiviare le immagini in un database, ma il più delle volte questi vantaggi vengono con le applicazioni basate su client.


0

Solo per aggiungere un po 'di più alle già buone risposte finora. È ancora possibile ottenere i benefici di caching sia dal livello di web forse e il livello di database, se si va il percorso vi tiene le immagini nel database.

Penso che per il database tu possa ottenere questo risultato dal modo in cui memorizzi le immagini in relazione ai dati testuali ad esse associati e se puoi accedere alle immagini in una query particolare in modo che il database possa memorizzare nella cache la query (solo teoria però sentiti libero di bombardarmi su quella parte).

Con il lato web, immagino che dal momento che la tua domanda è contrassegnata con asp.net, dovresti seguire il percorso di utilizzare un gestore http per fornire le immagini. Quindi hai tutti i vantaggi del framework a tua disposizione e puoi mantenere la logica del tuo dominio più pulita dovendo solo passare la chiave della tua immagine al gestore http.


-1

Perché non scegliere un database NoSql individuale per archiviare i file.

Ti offre integrità dei dati, coerenza dei dati come menzionato da @chburd.

Mentre tu rdbms resta piccolo.


-1
  1. Ecco un esempio passo dopo passo (approccio generale, implementazione Spring Eclipse) di memorizzazione di immagini nel file system e conservazione dei loro metadati in DB: http://www.devmanuals.com/tutorials/java/spring/spring3/mvc /Spring3MVCImageUpload.html
  2. Ecco anche un esempio: http://www.journaldev.com/2573/spring-mvc-file-upload-example-tutorial-single-and-multiple-files
  3. Inoltre puoi esaminare una base di codice di questo progetto: https://github.com/jdmr/fileUpload . Presta attenzione a questo controller.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.