web-dev-qa-db-fra.com

À faire ou à ne pas faire: stocker des images dans une base de données

Dans le cadre d'une application web, mon ancien patron a toujours dit de mettre une référence à une image dans la base de données, pas à l'image elle-même. J'ai tendance à convenir que le stockage d'une URL par rapport à l'image elle-même dans la base de données est une bonne idée, mais là où je travaille maintenant, nous stockons beaucoup d'images dans la base de données.

La seule raison pour laquelle je peux penser est peut-être qu'il est plus sûr? Vous ne voulez pas que quelqu'un ait un lien direct vers une URL? Mais si tel est le cas, vous pouvez toujours avoir le site Web/serveur à gérer les images, comme les gestionnaires dans asp.net, de sorte qu'un utilisateur doit s'authentifier pour afficher l'image. Je pense également que les performances seraient compromises en retirant les images de la base de données. Y a-t-il d'autres raisons pour lesquelles ce serait une bonne/moins bonne idée de stocker des images dans une base de données?


Duplicata exact: Images utilisateur: stockage de la base de données ou du système de fichiers?
Duplicata exact: Stockage d'images dans la base de données: oui ou non?
Duplicata exact: Dois-je stocker mes images dans la base de données ou les dossiers?
Duplicata exact: Souhaitez-vous stocker des données binaires dans une base de données ou des dossiers?
Dupliquer exact: Stocker les images sous forme de fichiers ou ou de la base de données pour une application Web?
Duplicata exact: Stockage d'un petit nombre d'images: blob ou fs?
Dupliquer exact: stocker l'image dans le système de fichiers ou la base de données?

30
nickytonline

Si vous à l'occasion devez récupérer une image et elle doit être disponible sur plusieurs serveurs Web différents. Mais je pense que c'est à peu près tout.

  • S'il ne doit pas être disponible sur plusieurs serveurs, il est toujours préférable de les mettre dans le système de fichiers.
  • S'il doit être disponible sur plusieurs serveurs et qu'il y a en fait une sorte de charge dans le système, vous aurez besoin d'une sorte de stockage distribué.

Nous parlons ici d'un cas Edge, où vous pouvez éviter d'ajouter un niveau supplémentaire de complexité à votre système en tirant parti de la base de données.

A part ça, ne le faites pas.

21
Emil H

Avantages de mettre des images dans une base de données.

  1. Transactions. Lorsque vous enregistrez le blob, vous pouvez le valider comme n'importe quel autre élément de données DB. Cela signifie que vous pouvez valider le blob avec n'importe laquelle des métadonnées associées et être assuré que les deux sont synchronisés. Si vous manquez d'espace disque? Aucun engagement. Le fichier n'a pas été complètement téléchargé? Aucun engagement. Erreur d'application stupide? Aucun engagement. Si la cohérence des images et des métadonnées associées est importante pour votre application, les transactions qu'une base de données peut fournir peuvent être une aubaine.

  2. Un système à gérer. Besoin de sauvegarder les métadonnées et les blobs? Sauvegardez la base de données. Besoin de les reproduire? Répliquez la base de données. Besoin de récupérer d'une panne partielle du système? Rechargez la base de données et faites avancer les journaux. Tous les avantages que les bases de données apportent aux données en général (mappage de volume, contrôle du stockage, sauvegardes, réplication, récupération, etc.) s'appliquent à vos objets blob. Plus de cohérence, une gestion plus facile.

  3. Sécurité. Les bases de données ont des fonctionnalités de sécurité à grain très fin qui peuvent être exploitées. Des schémas, des rôles d'utilisateur et même des choses comme des "vues en lecture seule" pour donner un accès sécurisé à un sous-ensemble de données. Toutes ces fonctionnalités fonctionnent également avec des tables contenant des objets blob.

  4. Gestion centralisée. Lié à # 2, mais fondamentalement, les DBA (comme s'ils n'avaient pas assez de puissance) arrivent à gérer une chose: la base de données. Les bases de données modernes (en particulier les plus grandes) fonctionnent très bien avec de grandes installations sur plusieurs machines. Une source unique de gestion simplifie les procédures, simplifie le transfert de connaissances.

  5. La plupart des bases de données modernes gèrent très bien les blobs. Avec une prise en charge de premier ordre des objets blob dans votre niveau de données, vous pouvez facilement diffuser des objets blob de la base de données vers le client. Bien qu'il y ait des opérations que vous pouvez faire qui "aspirent" tout le blob en une seule fois, si vous n'avez pas besoin de cette fonctionnalité, ne l'utilisez pas. Étudiez l'interface SQL de votre base de données et tirez parti de ses fonctionnalités. Aucune raison de les traiter comme des "grosses chaînes" qui sont traitées de façon monolithique et transforment vos blobs en grosses bombes qui engloutissent la mémoire et brisent le cache.

  6. Tout comme vous pouvez configurer des serveurs de fichiers dédiés pour les images, vous pouvez configurer des serveurs d'objets blob dédiés dans votre base de données. Donnez-leur des volumes de disque dédiés, des schémas dédiés, des caches dédiés, etc. Toutes vos données dans la base de données ne sont pas les mêmes, ou se comportent de la même manière, aucune raison de les configurer toutes de la même manière. De bonnes bases de données ont un niveau de contrôle très fin.

Le principal problème concernant la diffusion d'un objet blob à partir d'une base de données est de vous assurer que votre couche HTTP exploite réellement tout le protocole HTTP pour effectuer le service.

De nombreuses implémentations naïves saisissent simplement le blob et les déchargent en gros dans le socket. Mais HTTP possède plusieurs fonctionnalités importantes bien adaptées à la diffusion d'images, etc. Notamment la mise en cache des en-têtes, des ETags et des transferts par blocs pour permettre aux clients de demander des "morceaux" de l'objet blob.

Assurez-vous que votre service HTTP respecte correctement toutes ces demandes et que votre base de données peut être un très bon citoyen du Web. En mettant en cache les fichiers dans un système de fichiers pour les servir par le serveur HTTP, vous bénéficiez de certains de ces avantages "gratuitement" (puisqu'un bon serveur le fera quand même pour les ressources "statiques"), mais assurez-vous que si vous faites cela, que vous honorer des choses comme les dates de modification, etc. pour les images.

Par exemple, quelqu'un demande espaceshuttle.jpg, une image créée le 1er janvier 2009. Cela finit par être mis en cache sur le système de fichiers à la date de la demande, disons le 1er février 2009. Plus tard, l'image est purgée du cache (stratégie FIFO , ou quoi que ce soit), et quelqu'un, plus tard, le 1er mars 2009 le demande à nouveau. Eh bien, il a maintenant une "date de création" le 1er mars 2009, même si tout le temps sa date de création était vraiment le 1er janvier. Donc, vous pouvez voir, surtout si votre cache tourne beaucoup, les clients qui utilisent If- Les en-têtes modifiés peuvent obtenir plus de données qu'ils n'en ont réellement besoin, car le serveur PENSE que la ressource a changé, alors qu'en fait ce n'est pas le cas.

Si vous gardez la date de création du cache synchronisée avec la date de création réelle, cela peut être moins un problème.

Mais le fait est que c'est quelque chose à réfléchir à tout le problème pour être un "bon citoyen du Web", et vous et vos clients économiser potentiellement une certaine bande passante, etc.

Je viens de parcourir tout cela pour un projet Java servant des vidéos à partir d'une base de données, et tout cela est un régal.

49
Will Hartung

Je comprends que la majorité des professionnels de la base de données croiseront les doigts et vous siffleront si vous stockez des images dans la base de données (ou même le mentionnez). Oui, il y a certainement des implications en termes de performances et de stockage lors de l'utilisation de la base de données comme référentiel pour de gros blocs de données binaires de toute nature (les images ont tendance à être les bits de données les plus courants qui ne peuvent pas être normalisés). Cependant, il existe très certainement des circonstances où le stockage d'images dans la base de données est non seulement autorisé mais conseillé.

Par exemple, dans mon ancien travail, nous avions une application où les utilisateurs pouvaient attacher des images à plusieurs points différents d'un rapport qu'ils rédigeaient, et ces images devaient être imprimées une fois terminé. Ces rapports ont été déplacés via la réplication SQL Server, et cela aurait introduit un énorme mal de tête pour essayer de gérer ces images et ces chemins de fichiers sur plusieurs systèmes et serveurs avec toute sorte de fiabilité. Les stocker dans la base de données nous a donné tout cela "gratuitement", et l'outil de création de rapports n'a pas eu à aller dans le système de fichiers pour récupérer l'image.

13
Adam Robinson

Mon conseil général serait de ne pas vous limiter à une approche ou à l'autre - optez pour la technique qui convient à la situation. Les systèmes de fichiers sont très bons pour stocker des fichiers et les bases de données sont très bonnes pour fournir des morceaux de données de petite taille sur demande. D'un autre côté, l'un des produits de mon entreprise doit stocker l'intégralité de l'état de l'application dans la base de données, ce qui signifie que les pièces jointes y vont également. Avec notre serveur de base de données (SQL Server 2005), je n'ai pas encore rencontré de problèmes de performances observables, même avec de gros clients et des bases de données.

SQL 2008 de Microsoft vous offre le meilleur des deux mondes avec la fonctionnalité FileStream - peut-être la peine d'être vérifiée. http://technet.Microsoft.com/en-us/library/bb933993.aspx

8
James Orr

L'un des avantages du stockage d'images dans la base de données est qu'il est portable sur tous les systèmes et indépendant de la disposition des systèmes de fichiers.

7
Thevs

La solution la plus simple/la plus performante/la plus évolutive est de stocker vos images sur le système de fichiers. Si la sécurité est un problème, placez-les dans un emplacement qui n'est pas accessible par le serveur Web et écrivez un script qui gère la sécurité et sert les fichiers.

En supposant que votre serveur Web/d'application et votre serveur de base de données sont des machines différentes, vous prendrez quelques coups en mettant des images dans la base de données: (1) latence du réseau entre les deux machines, (2) surcharge de connexion DB, (3) consommant une base de données supplémentaire connexion pour chaque image servie. Je serais plus préoccupé par le dernier point: si votre site sert beaucoup d'images, vos serveurs Web vont consommer de nombreuses connexions DB et pourraient épuiser vos pools de connexions.

6
cliff.meyers

Si votre application s'exécute sur plusieurs serveurs, je stocke la copie de référence de vos images dans la base de données, puis les mets en cache à la demande sur les systèmes de fichiers. Faire cela est bien moins une douleur sujette aux erreurs que d'essayer de synchroniser les systèmes de fichiers latéralement.

Si votre application se trouve sur un seul serveur, alors oui, restez fidèle au système de fichiers et demandez à la base de données de conserver un chemin d'accès aux données.

5
chaos

La plupart des bases de données SQL ne sont bien sûr pas conçues pour servir des images, mais il y a une certaine commodité associée à les avoir dans la base de données.

Par exemple, si vous avez déjà une base de données en cours d'exécution et que la réplication est configurée. Vous disposez instantanément d'une banque d'images HA plutôt que d'essayer de répliquer un système de fichiers basé sur rsync ou nfs. De plus, avoir un tas de processus Web (ou concevoir un nouveau service) pour écrire des fichiers sur le disque augmente un peu votre complexité. Vraiment, c'est juste plus de pièces mobiles.

À tout le moins, je recommanderais de conserver les "métadonnées" sur l'image (telles que les autorisations, qui en est propriétaire, etc.) et les données réelles séparées dans différentes tables, il sera donc assez facile de basculer vers un autre magasin de données. la ligne. Cela, associé à une sorte de CDN ou de mise en cache, devrait vous donner de très bonnes performances jusqu'à un certain point, donc je suppose que cela dépend de la façon dont cette application doit être évolutive et de la façon dont vous équilibrez cela avec la facilité de mise en œuvre.

3
rhettg

Vous n'avez pas besoin de stocker l'URL (si vous pensez que cela n'est pas sûr). Vous pouvez simplement stocker un identifiant unique qui référence l'image ailleurs.

Le stockage de la base de données a tendance à être plus cher et plus coûteux à entretenir qu'un système de fichiers - par conséquent, je ne stockerais PAS BEAUCOUP d'images dans une base de données.

2
Fortyrunner

Si ce sont des images qui sortent régulièrement de la base de données, j'essaierais toujours d'utiliser le système de fichiers.

S'il s'agissait d'images qui devaient être retirées de temps en temps et que leur enregistrement dans la base de données facilite la vie, cela ne me pose aucun problème.

1
user31571

J'ai stocké des images dans une base de données pour une application de démonstration. La raison pour laquelle je l'ai fait était la sécurité - la suppression d'un enregistrement que je ne devrais pas avoir n'était pas un gros problème, mais la suppression d'un fichier que je n'aurais pas dû aurait pu être un problème!

Si les performances étaient devenues un problème, j'aurais cherché à savoir si la suppression de fichiers non fiables était une possibilité réelle ou non.

1
Andrew Grimm

la récupération après sinistre n'est absolument pas amusante lorsque vous avez des téraoctets de données d'image stockées dans la base de données. Vous feriez mieux de trouver une meilleure façon de distribuer vos données pour les rendre plus fiables etc ... Bien sûr, tous les frais généraux (mentionnés ci-dessus) sont multipliés lors de la réplication et ainsi de suite ...

Ne le fais pas!

1
Richard

Cela ressemble vraiment à un problème de KISS (gardez-le simple stupide). Les systèmes de fichiers sont conçus pour gérer facilement le stockage de fichiers image, mais ce n'est pas facile à faire dans une base de données et à gâcher le données. Pourquoi prendre un coup de performance et toutes les difficultés dans le sql et le rendu quand vous pouvez juste vous soucier de la sécurité des fichiers? Vous pouvez également gérer des systèmes mixtes avec NFS ou CIFS. Les systèmes de fichiers sont des technologies matures. Beaucoup plus simple, plus robuste.

1
Dan Littlejohn