Come aggiungere il supporto immagine all'applicazione database client-server?

6

Ho una domanda architettonica su un progetto a cui sto lavorando.

Attualmente è una semplice applicazione .NET C # che gira su diversi computer client e comunica con un server MySQL centrale per l'archiviazione dei dati. Al momento non esiste un'applicazione o un servizio sul server, solo MySQL.

Vorrei aggiungere il supporto dell'immagine in modo che gli utenti possano aggiungere immagini al database (e visualizzare dopo il fatto), ma dopo aver memorizzato le immagini direttamente in MySQL come BLOB ho deciso che questo approccio è una cattiva idea, come suggerito in molti post su SO.

L'applicazione non può memorizzare immagini sul filesystem locale perché sarebbero inaccessibili ad altri utenti non sullo stesso host locale.

Stando così le cose, non sono sicuro del modo migliore per implementare il supporto dell'immagine altrimenti:

  • Le macchine sono tutte basate su Windows, posso configurare una cartella condivisa, ma poi ho il mal di testa di mantenere un'unità di rete mappata e credenziali / permessi utente.
  • Ho pensato di aggiungere un'altra applicazione (o servizio) che gira sul server e gestisce la lettura / scrittura di immagini sul lato server, ma questo sembra ridondante alla luce del fatto che i computer sono già in grado di trasferire i file .
  • Dovrei prendere in considerazione la creazione di un'applicazione sul server per gestire tutte le comunicazioni tra i client e il database SQL, aggiungendo la comunicazione del filesystem lì?
posta JYelton 04.11.2011 - 17:32
fonte

4 risposte

1

Memorizzare le immagini nel database è non sempre una cattiva idea. Se si dispone di una piccola quantità di immagini, ad esempio nel raggio di decine di migliaia e di dimensioni ridotte, a volte la convenienza di archiviare le immagini nel database supera la complessità aggiunta introdotta aggiungendo un ulteriore server di archiviazione che deve essere scritto e supportato nel mix. Memorizzare l'immagine nel db più efficiente significa? No. Emme importa se hai solo 10 applicazioni client che accedono a un paio di centinaia di immagini al giorno? Probabilmente no. In tal caso, vivi con l'inefficienza e risparmia un sacco di sforzi.

Se hai un lotto di immagini (milioni, decine di milioni, ... ho lavorato su sistemi che tracciano miliardi), allora ti servirà un'applicazione server separata in grado di gestire archiviazione e recupero di file. Ad un livello base questo può essere (ad esempio) semplicemente un'app server tcp / ip in grado di gestire le richieste di file, nonché accettarle da tutta la rete (un server web che esegue uno script PHP potrebbe essere adattato per questo). Dovresti semplicemente accedere alle immagini basate su un ID nel database per una riga che memorizza i metadati relativi a quell'immagine. Ricorda, se questo è su un cavo pubblico, dovrai implementare il tuo sistema di autorizzazione per accedere alle immagini. Server più complicati potrebbero gestire il mirroring, le conversioni dei tipi di file e la migrazione di file verso e da supporti di memorizzazione a lungo termine (e meno costosi).

    
risposta data 04.11.2011 - 19:41
fonte
2

Suggerisco di leggere To BLOB or Not To BLOB - si tratta di un documento di ricerca Microsoft relativo a questo problema.

Hanno testato su SQL Server 2008 e hanno concluso che se la maggior parte dei file ha meno di 150kb, l'archiviazione nel DB è adatta.

Naturalmente, dovresti testare il tuo ambiente e il tuo database.

    
risposta data 04.11.2011 - 18:00
fonte
2

La soluzione migliore che suggerirei è quella di caricare (o archiviare) tutte le immagini dietro un server Web e collegare ciascuna risorsa con un id (o URL) univoco che può essere memorizzato all'interno del DB.

Poiché è dietro un server web, può essere accessibile tramite un recupero diretto non caricherà il server database per estrarre l'immagine da esso. Inoltre, utilizzando gli URL (basati sul Web), non si è limitati dallo spazio fisico di un determinato disco rigido o si preoccupano della ridondanza, del bilanciamento del carico ecc. Perché i meccanismi basati sul web sono abbastanza ben stabiliti per consentire una ridistribuzione massiva.

Inoltre, puoi estendere l'autenticazione basata sull'utente finale per l'accesso effettivo.

    
risposta data 04.11.2011 - 19:17
fonte
0

The application can't store images on the local filesystem because they would then be inaccessible to other users not on the same local host.

1 - Memorizzare le immagini nel database è non una grande idea. Tuttavia, è possibile memorizzarli su una tabella separata dai dati normali in un formato compresso.

2 - È possibile memorizzare le immagini sul file system del server di database e utilizzare FTP per accedervi.

3 - Se questo non è ciò che desideri, dovrai utilizzare un server (intranet / internet) in cui è possibile archiviare tali immagini. Potresti anche richiedere un servizio da utilizzare per la memorizzazione e il recupero delle immagini in un meaner protetto.

    
risposta data 04.11.2011 - 17:43
fonte

Leggi altre domande sui tag