Per semplicità, supponiamo di sviluppare un'app mobile come Instagram. Gli utenti possono scaricare immagini dal server e caricare le proprie immagini. Attualmente il server memorizza tutte le immagini (in realtà, solo piccole miniature) in un database MySQL come BLOB. Sembra che il modo più comune per trasferire le immagini sia utilizzando la codifica Base64, che mi lascia con due opzioni:MySQL - Base64 vs BLOB
- Il server memorizza tutte le immagini come BLOB. Per caricare un'immagine, il client lo codifica nella stringa Base64, quindi lo invia al server. Il server decodifica l'immagine BACK in formato binario e la memorizza come BLOB nel database. Quando il client richiede un'immagine, il server ricodifica l'immagine come stringa Base64 e la invia al client, che la decodifica nuovamente in binario per la visualizzazione.
- Il server memorizza tutte le immagini come stringhe Base64. Per caricare un'immagine, il client lo codifica nella stringa Base64 e lo invia al server. Il server non esegue alcuna codifica o decodifica, ma semplicemente memorizza la stringa nel database. Quando il client richiede un'immagine, la stringa Base64 viene restituita al client, che quindi la decodifica per la visualizzazione.
Chiaramente, l'opzione # 1 richiede un'elaborazione significativamente maggiore sul server, poiché le immagini devono essere codificate/decodificate con ogni singola richiesta. Ciò mi spinge verso l'opzione n. 2, ma alcune ricerche hanno suggerito che l'archiviazione della stringa Base64 in MySQL è molto meno efficiente rispetto all'archiviazione dell'immagine direttamente come BLOB ed è generalmente scoraggiata.
Non sono certo il primo ad incontrare questa situazione, quindi qualcuno ha suggerimenti sul modo migliore per farlo funzionare?
L'opzione n. 3 non contiene immagini nel database. Hanno un sistema per questo: il filesystem. – tadman
Ho iniziato a memorizzare i percorsi dei file, ma alcune ricerche sulle versioni più recenti di MySQL hanno suggerito che è in realtà più efficiente memorizzare piccoli file (sotto 1 o 2 mb) come BLOB. Le mie immagini sono solo pochi kb, quindi è molto più semplice mantenere questo modo. – hundley
Il backup di un database pieno di BLOB è un vero incubo. È costoso replicare questi, costosi per sostenerli, estremamente doloroso per ripristinarli, e straziante per dividerli quando diventano troppo grandi. A meno che tu non abbia a che fare con quantità insignificanti di dati, alla fine questo esploderà. I file su disco possono essere replicati facilmente usando qualcosa di rudimentale come 'rsync'. Lo stesso non è vero per MySQL. – tadman