Memorizzazione delle immagini nel DB - Sì o No?


415

Quindi sto usando un'app che archivia pesantemente le immagini nel DB. Qual è la tua opinione al riguardo? Sono più di un tipo per memorizzare la posizione nel filesystem, piuttosto che memorizzarla direttamente nel DB.

Quali pensi siano i pro / contro?


Bene, puoi fare entrambe le cose con una cache del disco transazionale .
Lilith River,

Risposte:


350

Sono responsabile di alcune applicazioni che gestiscono molte TB di immagini. Abbiamo scoperto che l'archiviazione dei percorsi dei file nel database è la migliore.

Ci sono un paio di problemi:

  • l'archiviazione del database è generalmente più costosa dell'archiviazione del file system
  • è possibile accelerare notevolmente l'accesso al file system con prodotti standard disponibili
    • ad esempio, molti server Web utilizzano la chiamata di sistema sendfile () del sistema operativo per inviare in modo asincrono un file direttamente dal file system all'interfaccia di rete. Le immagini archiviate in un database non beneficiano di questa ottimizzazione.
  • cose come server web, ecc., non hanno bisogno di codifiche o elaborazioni speciali per accedere alle immagini nel file system
  • i database vincono laddove l'integrità transazionale tra l'immagine e i metadati è importante.
    • è più complesso gestire l'integrità tra metadati db e dati del file system
    • è difficile (nel contesto di un'applicazione web) garantire che i dati siano stati scaricati su disco nel filesystem

33
quali prodotti standard sono disponibili per "accelerare" il file system?
Andrei Rînea,

22
Mentre gestisco solo 3 TB di file, sono assolutamente d'accordo. I database sono per dati strutturati, non per BLOB.
derobert,

7
@derobert: piuttosto, se non userete mai un elemento di dati in una query, come condizione o per un join, probabilmente non appartiene al database. Poi di nuovo, se hai una bella funzione di database per interrogare le immagini per somiglianza ...
Nils Weinander,

14
quali prodotti standard sono disponibili per "accelerare" il file system?
ablmf

5
Ri: prodotti "super-acceleranti": la maggior parte dei server Web può ora sfruttare la chiamata di sistema sendfile () per consegnare i file statici in modo asincrono al client. Scarica sul sistema operativo il compito di spostare il file dal disco all'interfaccia di rete. Il sistema operativo può farlo in modo molto più efficiente, operando nello spazio del kernel. Questo, per me, sembra una grande vittoria per il file system rispetto a db per l'archiviazione / la pubblicazione di immagini.
Alan Donnelly,

140

Come con la maggior parte dei problemi, non è così semplice come sembra. Ci sono casi in cui avrebbe senso archiviare le immagini nel database.

  • Stai memorizzando immagini che cambiano in modo dinamico, diciamo fatture e volevi ottenere una fattura come era il 1 ° gennaio 2007?
  • Il governo vuole che tu mantenga 6 anni di storia
  • Le immagini archiviate nel database non richiedono una diversa strategia di backup. Le immagini memorizzate sul filesystem lo fanno
  • È più facile controllare l'accesso alle immagini se si trovano in un database. Gli amministratori inattivi possono accedere a qualsiasi cartella sul disco. Ci vuole un amministratore veramente determinato per curiosare in un database per estrarre le immagini

D'altra parte ci sono problemi associati

  • Richiede codice aggiuntivo per estrarre e trasmettere le immagini
  • La latenza potrebbe essere più lenta dell'accesso diretto ai file
  • Carico più pesante sul server di database

2
Non avere una strategia di backup separata può essere un grosso problema quando si scrivono applicazioni installate in locale (come SharePoint). Quando si crea un backup di SharePoint, tutto è nel DB, il che lo rende molto semplice.
Eric Schoonover,

44
La sicurezza per oscurità non è in realtà una strategia di controllo degli accessi!
Jon Cage,

5
Non credo che stia sostenendo la sicurezza per oscurità - sta dicendo che l'inserimento di immagini nel DB aggiunge un altro livello di sicurezza. (Penso ... @Conrad, non voglio mettere parole in bocca)
AJ.

Ho scelto di archiviare le immagini nel database a causa del vantaggio del backup singolo (o più in generale, con tutti i dati in un unico posto), ma i problemi che menzioni sono veri, motivo per cui memorizzo nella cache le immagini sul filesystem. È il migliore dei due mondi, e sono sorpreso che nessuna delle risposte migliori qui lo menzioni.
Bart van Heukelom,

Per caso, stai usando la libreria ImageResizing.Net per gestire la cache delle immagini del disco SQL->? È la cache del disco più avanzata, scalabile e robusta che puoi ottenere ...
Lilith River,


56

Potrebbe essere un po 'lungo, ma se stai usando (o stai pianificando di usare) SQL Server 2008 ti consiglio di dare un'occhiata al nuovo tipo di dati FileStream .

FileStream risolve la maggior parte dei problemi relativi alla memorizzazione dei file nel DB:

  1. I BLOB sono effettivamente archiviati come file in una cartella.
  2. Le macchie si può accedere utilizzando sia una connessione al database o il file system.
  3. I backup sono integrati.
  4. La migrazione "funziona".

Tuttavia, "Transparent Data Encryption" di SQL non crittografa gli oggetti FileStream, quindi se è una considerazione, è meglio archiviarli come varbinary.

Dall'articolo MSDN:

Le istruzioni Transact-SQL possono inserire, aggiornare, interrogare, cercare ed eseguire il backup dei dati FILESTREAM. Le interfacce del file system Win32 forniscono l'accesso in streaming ai dati.
FILESTREAM utilizza la cache di sistema NT per la memorizzazione nella cache dei dati del file. Ciò aiuta a ridurre qualsiasi effetto che i dati FILESTREAM potrebbero avere sulle prestazioni del Motore di database. Il pool di buffer di SQL Server non viene utilizzato; pertanto, questa memoria è disponibile per l'elaborazione delle query.


+1 per FileStream. In realtà memorizza i BLOB come file sul disco, ma li gestisce in modo transazionale.
John Gietzen,

Inoltre, il server SQL consente ai BLOB FileStream di accedere direttamente al di fuori del disco, in modo da poter evitare di collegare la connessione DB
John Gietzen,

Tuttavia, aggiunta latenza tra il DB e il server Web ... E il server Web dovrà caricarlo in memoria per trasmetterlo al client invece di essere in grado di trasmetterlo dal disco, a meno che non si stia utilizzando la cache del disco.
Lilith River,

39

I percorsi dei file nel DB sono sicuramente la strada da percorrere - ho sentito storie su storie dai clienti con TB di immagini che è diventato un incubo tentare di archiviare qualsiasi quantità significativa di immagini in un DB - la performance da sola è troppo.


35

Nella mia esperienza, a volte la soluzione più semplice è denominare le immagini in base alla chiave primaria . Quindi è facile trovare l'immagine che appartiene a un particolare record e viceversa. Ma allo stesso tempo non stai memorizzando nulla sull'immagine nel database.


Davvero molto bello. I tuoi utenti ora possono facilmente aumentare il tuo nome file per accedere ad altri file ...
Marijn Huizendveld

6
@Marijn: Questo è solo se esponi le immagini al mondo.
Seun Osewa,

Abbiamo fatto qualcosa di molto simile con i nostri documenti di imaging (la nostra chiave primaria è una chiave composita di tre elementi), ma abbiamo aggiunto la data e l'ora in cui il documento è stato scansionato in modo da poter avere più versioni nella stessa directory.
Andrew Neely,

@Osewa, come va? Sì, per accedere direttamente al file, l'utente finale avrebbe bisogno di accedere alla cartella. Potresti avere un processo per servire il file via FTP in base alla richiesta e la sicurezza sarebbe alla pari con il server SQL.
Andrew Neely,

31

Il trucco qui è di non diventare un fanatico.

Una cosa da notare qui è che nessuno nel campo del file system pro ha elencato un determinato file system. Questo significa che tutto, da FAT16 a ZFS, batte facilmente ogni database?

No.

La verità è che molti database battono molti file system, anche quando parliamo solo di velocità pura.

Il corretto modo di agire è prendere la decisione giusta per il tuo preciso scenario e, per farlo, avrai bisogno di alcuni numeri e di alcune stime dei casi d'uso.


6
Non vedo nessuno affermare che un filesystem è più veloce di un DB il 100% delle volte (leggi la risposta di Mark Harrison). È un po 'un pagliaccio. Probabilmente ci sono situazioni in cui è preferibile non indossare la cintura di sicurezza, ma in generale indossare una cintura di sicurezza è una buona idea.
Calvin,

30

Nei luoghi in cui DEVI garantire l'integrità referenziale e la conformità ACID, è richiesta la memorizzazione delle immagini nel database.

Non è possibile garantire transazionalmente che l'immagine e i metadati relativi all'immagine memorizzata nel database facciano riferimento allo stesso file. In altre parole, è impossibile garantire che il file sul filesystem sia sempre e solo modificato contemporaneamente e nella stessa transazione dei metadati.


7
In realtà, no, puoi. Finché i file di immagine non vengono mai eliminati, modificati o sovrascritti una volta creati, tutti i file di immagine vengono sincronizzati prima di tentare di eseguire il commit delle transazioni, non vi è corruzione del file system, si può essere sicuri che i file di immagine e i metadati siano sincronizzati. Per alcune applicazioni, sono troppi if, immagino.
Seun Osewa,

Andrei ancora oltre e direi che con un file system Journaling e una logica di programma aggiuntiva, è possibile ottenere la conformità ACID. I passaggi sarebbero scrivere il record db, scrivere il file. Se il file viene eseguito il commit, eseguire il commit della transazione db.
Andrew Neely,

28

Come altri hanno già detto, SQL 2008 viene fornito con un tipo Filestream che consente di archiviare un nome file o identificatore come puntatore nel db e memorizza automaticamente l'immagine sul proprio filesystem, il che è un ottimo scenario.

Se si trova in un database più vecchio, direi che se lo si archivia come dati BLOB, in realtà non si otterrà nulla dal database nel modo di cercare funzionalità, quindi probabilmente è meglio per memorizzare un indirizzo su un filesystem e memorizzare l'immagine in quel modo.

In questo modo risparmi anche spazio sul tuo filesystem, poiché risparmierai solo l'esatta quantità di spazio, o anche lo spazio compattato sul filesystem.

Inoltre, potresti decidere di salvare con qualche struttura o elementi che ti consentono di sfogliare le immagini grezze nel tuo filesystem senza alcun db hit o di trasferire i file in blocco su un altro sistema, disco rigido, S3 o un altro scenario - aggiornando la posizione in il tuo programma, ma mantieni la struttura, ancora una volta senza molto successo, cercando di estrarre le immagini dal tuo db quando provi ad aumentare la memoria.

Probabilmente, ti permetterebbe anche di gettare alcuni elementi della cache, basati sugli URL delle immagini comunemente colpiti nel tuo motore / programma web, quindi ti stai salvando anche lì.


27

Le piccole immagini statiche (non più di un paio di mega) che non vengono modificate frequentemente, devono essere archiviate nel database. Questo metodo offre numerosi vantaggi, tra cui una portabilità più semplice (le immagini vengono trasferite con il database), un backup / ripristino più semplice (il backup delle immagini viene eseguito con il database) e una migliore scalabilità (una cartella del file system con migliaia di piccoli file di miniature sembra un incubo di scalabilità per me).

Servire le immagini da un database è facile, basta implementare un gestore http che serve l'array di byte restituito dal server DB come flusso binario.


Direi che il database è migliore per i file che vengono frequentemente modificati, poiché la coerenza può essere un problema in quel caso.
Seun Osewa,

26

Ecco un interessante white paper sull'argomento.

BLOB o Non BLOB: archiviazione di oggetti di grandi dimensioni in un database o un filesystem

La risposta è, dipende." Certamente dipenderà dal server di database e dal suo approccio all'archiviazione BLOB. Dipende anche dal tipo di dati archiviati nei BLOB, nonché dalla modalità di accesso a tali dati.

I file di dimensioni inferiori possono essere archiviati e consegnati in modo efficiente utilizzando il database come meccanismo di archiviazione. I file più grandi dovrebbero probabilmente essere archiviati nel modo migliore usando il file system, specialmente se verranno modificati / aggiornati spesso. (La frammentazione dei BLOB diventa un problema per quanto riguarda le prestazioni.)

Ecco un ulteriore punto da tenere a mente. Uno dei motivi che supportano l'uso di un database per archiviare i BLOB è la conformità ACID. Tuttavia, l'approccio utilizzato dai tester nel white paper (opzione Bulk Logged di SQL Server) che ha raddoppiato il throughput di SQL Server, ha effettivamente modificato la "D" in ACID in una "d", poiché i dati BLOB non erano registrati con le scritture iniziali per la transazione. Pertanto, se la piena conformità ACID è un requisito importante per il sistema, dimezzare le cifre della velocità effettiva di SQL Server per le scritture del database quando si confrontano l'I / O dei file con l'I / O del BLOB del database.


25

Una cosa che non ho ancora visto nessuno menzionato, ma che vale sicuramente la pena notare è che ci sono problemi associati alla memorizzazione di grandi quantità di immagini anche nella maggior parte dei filesystem. Ad esempio, se segui l'approccio sopra citato e dai un nome a ciascun file di immagine dopo la chiave primaria, sulla maggior parte dei filesystem ti imbatterai in problemi se provi a mettere tutte le immagini in una grande directory una volta raggiunto un numero molto elevato di immagini ( ad esempio in centinaia di migliaia o milioni).

Una volta una soluzione comune a questo è quella di portarli in un albero equilibrato di sottodirectory.


Lo penseresti, ma i problemi sono in realtà minori; Ho un'app con milioni di file in un'unica directory, accessibile da centinaia di utenti, senza problemi. Non è intelligente, ma funziona. Il problema più grande è che se usi Explorer per sfogliare la directory, guardi una torcia per sempre.
SqlACID,

1
È meglio usare un filesystem che non ha problemi con le directory di grandi dimensioni
Seun Osewa,

8
Avevo un'app con milioni di file in una directory (server con RHEL 4) - per elencare anche il contenuto della directory (reindirizzare a un file) ci sono voluti giorni e ho creato un file di output di dimensioni 100 MB. Ora sono in un database, ho un singolo file che posso spostare o eseguire il backup abbastanza facilmente.
Richard,

1
@Seun Osewa: ogni file system ha dei limiti ... e se ne conosci uno che non ha problemi a memorizzare milioni di voci nella stessa directory, fammi sapere!
Guillaume

1
@Seun Osewa: il database è ora fino a 28 GB, con 5,4 M di record. Ho finito per dover partizionare la tabella del database, quindi ho diversi file di cui eseguire il backup che hanno una dimensione di circa 5 GB. Sposta ora le singole immagini su Amazon S3, quindi devo solo memorizzare il nome file nel DB (e Amazon può fare i backup )
Richard,

22

Qualcosa che nessuno ha menzionato è che il DB garantisce azioni atomiche, integrità transazionale e gestione della concorrenza. Anche l'integrità referenziale è fuori dalla finestra con un filesystem - quindi come fai a sapere che i nomi dei tuoi file sono ancora corretti?

Se hai le tue immagini in un file system e qualcuno sta leggendo il file mentre stai scrivendo una nuova versione o addirittura cancellando il file - cosa succede?

Utilizziamo i BLOB perché sono anche più facili da gestire (backup, replica, trasferimento). Funzionano bene per noi.


Qual è la probabilità di avere due aggiornamenti simultanei a una particolare immagine?
Arafangion,

1
non hai bisogno di aggiornamenti simultanei per avere problemi - può essere una lettura e una scrittura. Nel nostro caso questo è quasi garantito.
Draemon,

20

Il problema con l'archiviazione di solo percorsi di file su immagini in un database è che l'integrità del database non può più essere forzata.

Se l'immagine effettiva a cui punta il percorso file non è disponibile, il database ha involontariamente un errore di integrità.

Dato che le immagini sono i dati effettivi ricercati e che possono essere gestite più facilmente (le immagini non scompaiono improvvisamente) in un database integrato anziché dover interfacciarsi con un qualche tipo di filesystem (se si accede in modo indipendente al filesystem, le immagini POTREBBE improvvisamente "scomparire"), andrei per memorizzarle direttamente come BLOB o simili.


17

In un'azienda in cui lavoravo, abbiamo archiviato 155 milioni di immagini in un database Oracle 8i (poi 9i). Valore di 7,5 TB.


5
Assolutamente. Apparentemente il database è molto più grande ora. Avere i dati in un database significa che anche replicare il database in siti diversi è molto più semplice.
graham.reeds

Ho visto una dimostrazione di Oracle in cui potrebbe effettivamente montare un file system nel database o qualcosa del genere. Sai se questo è quello che hai fatto? (Mi dispiace, non sono a conoscenza di Oracle, quindi forse sto parlando di immondizia.)
Stu Thompson,

Non credo - stava memorizzando le immagini nel database come database. Il database è stato ottimizzato in modo aggressivo: ricordo più discussioni riguardo alle dimensioni delle immagini che cambiano con l'aggiunta e la rimozione dei campi. Tutto era allineato al confine.
graham.reeds,

14

Normalmente, sono fermamente contrario a prendere la parte più costosa e più difficile da scalare della tua infrastruttura (il database) e a caricarci tutto. D'altra parte: semplifica notevolmente la strategia di backup, soprattutto quando si hanno più server Web e si deve in qualche modo mantenere sincronizzati i dati.

Come la maggior parte delle altre cose, dipende dalle dimensioni e dal budget previsti.


13

Abbiamo implementato un sistema di imaging dei documenti che archivia tutte le sue immagini nei campi BLOB SQL2005. Al momento ci sono diverse centinaia di GB e stiamo assistendo a tempi di risposta eccellenti e ad un degrado delle prestazioni ridotto o nullo. Inoltre, per quanto riguarda la conformità normativa, disponiamo di un livello middleware che archivia i documenti appena pubblicati su un sistema di jukebox ottico che li espone come un file system NTFS standard.

Siamo rimasti molto soddisfatti dei risultati, in particolare per quanto riguarda:

  1. Facilità di replica e backup
  2. Capacità di implementare facilmente un sistema di versioning dei documenti

11

Se si tratta di un'applicazione basata sul Web, potrebbero esserci dei vantaggi nel memorizzare le immagini su una rete di consegna di archiviazione di terze parti, come Amazon S3 o la piattaforma Nirvanix.


11

Presupposto: l'applicazione è abilitata per il web / basata sul web

Sono sorpreso che nessuno lo abbia mai menzionato ... delegalo ad altri specialisti -> usa un provider di hosting di file / immagini di terze parti .

Archivia i tuoi file su un servizio online a pagamento come

Un altro thread StackOverflow ne parla qui .

Questa discussione spiega perché dovresti usare un provider di hosting di terze parti.

Ne vale davvero la pena. Lo memorizzano in modo efficiente. Nessuna banda senza essere caricata dai tuoi server alle richieste del client, ecc.


10

Se non sei su SQL Server 2008 e hai dei solidi motivi per inserire specifici file di immagine nel database, puoi adottare l'approccio "entrambi" e utilizzare il file system come cache temporanea e utilizzare il database come repository principale .

Ad esempio, la tua logica aziendale può verificare se esiste un file immagine sul disco prima di servirlo, recuperandolo dal database quando necessario. Ciò ti offre la possibilità di più server Web e meno problemi di sincronizzazione.


+1 Ciò consente anche di archiviare l'immagine originale, offrendo la versione memorizzata nella cache / ottimizzata e al contempo di modificare le dimensioni / la compressione in seguito
Deebster,

7

Non sono sicuro di quanto sia un esempio di "mondo reale", ma al momento ho un'applicazione che memorizza i dettagli di un gioco di carte collezionabili, comprese le immagini per le carte. Ad oggi, il numero di record per il database è solo di 2851 record, ma dato il fatto che alcune carte sono state rilasciate più volte e hanno disegni alternativi, in realtà è stato più efficiente dimensionalmente scansionare il "quadrato primario" del disegno e quindi dinamicamente genera il bordo e gli effetti vari per la carta quando richiesto.

Il creatore originale di questa libreria di immagini ha creato una classe di accesso ai dati che esegue il rendering dell'immagine in base alla richiesta e lo fa abbastanza velocemente per la visualizzazione e la singola scheda.

Ciò facilita anche l'implementazione / gli aggiornamenti quando vengono rilasciate nuove schede, invece di comprimere un'intera cartella di immagini e inviarle nel pipe e assicurandomi che venga creata la struttura delle cartelle corretta, aggiorno semplicemente il database e faccio scaricare nuovamente l'utente. Questo attualmente misura fino a 56 MB, il che non è eccezionale, ma sto lavorando a una funzione di aggiornamento incrementale per le versioni future. Inoltre, esiste una versione "senza immagini" dell'applicazione che consente agli utenti con accesso remoto di ottenere l'applicazione senza il ritardo del download.

Questa soluzione ha funzionato alla grande sin da quando l'applicazione stessa è destinata come singola istanza sul desktop. Esiste un sito Web in cui tutti questi dati sono archiviati per l'accesso online, ma per questo non utilizzerei la stessa soluzione. Sono d'accordo che l'accesso ai file sarebbe preferibile perché ridimensionerebbe meglio la frequenza e il volume delle richieste fatte per le immagini.

Spero che questa non sia troppa chiacchiera, ma ho visto l'argomento e volevo fornire alcune mie intuizioni da un'applicazione su piccola / media scala relativamente riuscita.


Quando si ha a che fare con la replica, la memorizzazione delle immagini nel database è di gran lunga superiore a IMO.
Segnale acustico


7

Dipende dal numero di immagini che stai per memorizzare e anche dalle loro dimensioni. Ho usato database per archiviare immagini in passato e la mia esperienza è stata abbastanza buona.

IMO, I professionisti dell'utilizzo del database per archiviare le immagini sono,

A. Non è necessaria la struttura FS per contenere le immagini
B. Gli indici del database hanno prestazioni migliori rispetto agli alberi FS quando deve essere memorizzato un numero maggiore di elementi
C. Il database ottimizzato in modo intelligente svolge un buon lavoro nella memorizzazione nella cache dei risultati della query
D. I backup sono semplici. Funziona bene anche se hai impostato la replica e il contenuto viene consegnato da un server vicino all'utente. In tali casi, non è richiesta la sincronizzazione esplicita.

Se le tue immagini saranno piccole (diciamo <64k) e il motore di archiviazione del tuo db supporta BLOB in linea (nei record), migliora ulteriormente le prestazioni in quanto non è richiesta alcuna indiretta (viene raggiunta la località di riferimento).

La memorizzazione di immagini può essere una cattiva idea quando si ha a che fare con un numero limitato di immagini di dimensioni enormi. Un altro problema con la memorizzazione delle immagini in db è che, come la creazione, i metadati, le date di modifica devono essere gestiti dall'applicazione.


7

Di recente ho creato un'app PHP / MySQL che memorizza file PDF / Word in una tabella MySQL (fino a 40 MB per file finora).

Professionisti:

  • I file caricati vengono replicati sul server di backup insieme a tutto il resto, non è necessaria alcuna strategia di backup separata (tranquillità).
  • Configurare il web server è leggermente più semplice perché non ho bisogno di avere una cartella / upload e dire a tutte le mie applicazioni dove si trova.
  • Posso utilizzare le transazioni per le modifiche per migliorare l'integrità dei dati: non devo preoccuparmi di file orfani e mancanti

Contro:

  • mysqldump ora impiega molto tempo perché ci sono 500 MB di dati di file in una delle tabelle.
  • Nel complesso non è molto efficiente in termini di memoria / CPU rispetto al filesystem

Definirei la mia implementazione un successo, si occupa dei requisiti di backup e semplifica il layout del progetto. Le prestazioni vanno bene per le 20-30 persone che usano l'app.


6

Nella mia esperienza ho dovuto gestire entrambe le situazioni: immagini archiviate nel database e immagini sul file system con percorso archiviato in db.

La prima soluzione, le immagini nel database, è in qualche modo "più pulita" poiché il livello di accesso ai dati dovrà occuparsi solo degli oggetti del database; ma questo va bene solo quando devi fare i conti con numeri bassi.

Ovviamente le prestazioni di accesso al database quando si trattano oggetti binari di grandi dimensioni stanno peggiorando e le dimensioni del database aumenteranno molto, causando di nuovo una perdita di prestazioni ... e normalmente lo spazio del database è molto più costoso dello spazio del file system.

D'altra parte, avere oggetti binari di grandi dimensioni memorizzati nel file system ti farà avere piani di backup che devono considerare sia il database che il file system, e questo può essere un problema per alcuni sistemi.

Un altro motivo per scegliere il file system è quando devi condividere i dati delle tue immagini (o suoni, video, qualunque cosa) con accesso di terze parti: in questi giorni sto sviluppando un'app Web che utilizza immagini a cui è necessario accedere dall'esterno "la mia web farm in modo tale che l'accesso al database per recuperare i dati binari sia semplicemente impossibile. Quindi a volte ci sono anche considerazioni di progettazione che ti guideranno a una scelta.

Considera anche, quando fai questa scelta, se devi avere a che fare con l'autorizzazione e l'autenticazione quando accedi agli oggetti binari: questi requisiti normalmente possono essere risolti in modo più semplice quando i dati sono archiviati in db.


4

Una volta ho lavorato su un'applicazione di elaborazione delle immagini. Abbiamo archiviato le immagini caricate in una directory simile a / images / [data odierna] / [numero ID]. Ma abbiamo anche estratto i metadati (dati exif) dalle immagini e archiviati nel database, insieme a un timestamp e simili.


4

In un precedente progetto ho archiviato immagini sul filesystem e questo ha causato molti mal di testa con backup, replica e il filesystem non sincronizzato con il database.

Nel mio ultimo progetto sto memorizzando le immagini nel database e memorizzandole nella cache sul filesystem, e funziona davvero bene. Finora non ho avuto problemi.


3

Secondo la raccomandazione sui percorsi dei file. Ho lavorato su un paio di progetti che dovevano gestire raccolte di risorse di grandi dimensioni e qualsiasi tentativo di archiviare le cose direttamente nel DB ha provocato dolore e frustrazione a lungo termine.

L'unico vero "pro" che mi viene in mente per quanto riguarda l'archiviazione nel DB è il potenziale per la facilità di risorse di immagine individuali. Se non ci sono percorsi di file da usare e tutte le immagini vengono trasmesse in streaming direttamente dal DB, non c'è pericolo che un utente trovi i file a cui non dovrebbe avere accesso.

Sembra che sarebbe meglio risolverlo con uno script intermedio che estrae i dati da un archivio di file inaccessibile al web. Quindi l'archiviazione DB non è REALMENTE necessaria.


3

La parola per strada è che a meno che tu non sia un fornitore di database che prova a dimostrare che il tuo database può farlo (come, diciamo, Microsoft che si vanta di Terraserver che memorizza immagini bajillion in SQL Server) non è una buona idea. Quando l'alternativa: archiviare immagini su file server e percorsi nel database è molto più semplice, perché preoccuparsi? I campi BLOB sono un po 'come le capacità fuoristrada dei SUV: la maggior parte delle persone non li usa, quelli che di solito si mettono nei guai, e poi ci sono quelli che lo fanno, ma solo per divertimento.


3

La memorizzazione di un'immagine nel database significa comunque che i dati dell'immagine finiscono da qualche parte nel file system ma sono oscurati in modo da non poter accedervi direttamente.

+ ves:

  • integrità del database
  • è facile da gestire poiché non devi preoccuparti di mantenere sincronizzato il filesystem quando un'immagine viene aggiunta o eliminata

-ves:

  • penalità di prestazione - una ricerca nel database è generalmente più lenta di una ricerca nel filesystem
  • non è possibile modificare direttamente l'immagine (ritaglia, ridimensiona)

Entrambi i metodi sono comuni e praticati. Dai un'occhiata ai vantaggi e agli svantaggi. Ad ogni modo, dovrai pensare a come superare gli svantaggi. La memorizzazione nel database di solito significa modificare i parametri del database e implementare un qualche tipo di memorizzazione nella cache. L'uso del filesystem richiede di trovare un modo per mantenere sincronizzati filesystem + database.

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.