Question

    

Cette question a déjà une réponse ici:

         

Dans le contexte 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. Je suis plutôt d’accord pour dire que stocker 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, nous stockons beaucoup d’images dans la base de données.

La seule raison pour laquelle je peux penser est que c'est peut-être plus sécurisé? Vous ne voulez pas que quelqu'un ait un lien direct vers une URL? Mais si tel est le cas, vous pouvez toujours laisser 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 aussi que les performances pourraient être affectées par l'extraction des 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?

Copie exacte: Images utilisateur: Stockage de la base de données ou du système de fichiers ?
Copie exacte : Stockage d'images dans la base de données: oui ou non ?
Copie exacte : Si je devais stocker mes images dans la base de données ou les dossiers?
Copie exacte : Voulez-vous stocker des données binaires dans une base de données ou des dossiers?
Copie exacte Stocker des images sous forme de fichiers ou de la base de données d'une application Web?
Copie exacte : Stockage d'un petit nombre d'images: blob ou fs?
Copie exacte : enregistrer l'image dans le système de fichiers ou base de données?

Était-ce utile?

La solution

Si vous parfois , vous devez récupérer une image qui doit être disponible sur plusieurs serveurs Web. Mais je pense que c'est à peu près tout.

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

Nous parlons ici d'un cas extrême dans lequel vous pouvez éviter d'ajouter un niveau de complexité supplémentaire à votre système en exploitant la base de données.

Sinon, ne le faites pas.

Autres conseils

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

  1. Transactions. Lorsque vous enregistrez le blob, vous pouvez le commettre comme n'importe quelle autre donnée de base de données. Cela signifie que vous pouvez commettre le blob avec n'importe laquelle des métadonnées associées et vous assurer que les deux sont synchronisés. Si vous manquez d'espace disque? Aucun commit. Le fichier n'a pas été téléchargé complètement? Aucun commit. Erreur d'application stupide? Aucun commit. Si la cohérence des images et de leurs 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épliquer la base de données. Besoin de récupérer d'une panne système partielle? Rechargez la base de données et déroulez 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 blobs. Plus de cohérence, une gestion plus facile.

  3. Sécurité. Les bases de données ont des fonctionnalités de sécurité très fines qui peuvent être exploitées. Schémas, rôles d'utilisateur, même des éléments tels que "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 blobs.

  4. Gestion centralisée. Relatif au n ° 2, mais en gros, les administrateurs de base de données (comme s’ils n’ont pas assez de puissance) doivent 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 les 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. Grâce à la prise en charge de premier ordre des blobs dans votre couche de données, vous pouvez facilement transférer des blobs de la base de données vers le client. Même s’il existe des opérations que vous pouvez faire, cela va "aspirer" le blob entier tout à la fois, si vous n'avez pas besoin de cette installation, alors ne l'utilisez pas. Étudiez l'interface SQL de votre base de données et exploitez ses fonctionnalités. Aucune raison de les traiter comme des "grosses chaînes". qui sont traités monolithiquement et transforment vos blobs en gros, gobent la mémoire, cachent des bombes.

  6. Tout comme vous pouvez configurer des serveurs de fichiers dédiés pour les images, vous pouvez configurer des serveurs 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 de la base de données ne sont pas identiques, ou se comportent de la même manière, aucune raison de les configurer de la même manière. Les bonnes bases de données ont un niveau de contrôle précis.

La première chose à faire en ce qui concerne la création d'un blob à partir d'une base de données est de s'assurer que votre couche HTTP exploite réellement tout le protocole HTTP pour effectuer le service.

De nombreuses implémentations naïves prennent simplement le blob et le déchargent en gros dans le socket. Mais HTTP possède plusieurs fonctionnalités importantes bien adaptées à la diffusion d’images, etc. de la goutte.

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 en vue de leur utilisation par le serveur HTTP, vous bénéficiez de certains de ces avantages "gratuit". (puisqu'un bon serveur le fera quand même pour des ressources "statiques"), mais assurez-vous que vous respectez ce que vous faites, par exemple des dates de modification, etc. pour les images.

Par exemple, quelqu'un demande le fichier spaceshuttle.jpg, une image créée le 1er janvier 2009. Elle est ensuite mise en cache sur le système de fichiers à la date de la demande, par exemple le 1er février 2009. Plus tard, l'image est purgée du cache. (Politique FIFO, ou autre), et quelqu'un, plus tard, le 1er mars 2009, le demande à nouveau. Eh bien, il a maintenant une "date de création" du 1er mars 2009, même si sa date de création était réellement le 1 er janvier. Vous pouvez donc voir, surtout si votre cache tourne beaucoup, que les clients qui utilisent Les en-têtes modifiés peuvent obtenir plus de données que nécessaire, car le serveur pense que la ressource a changé, alors qu'en fait, il n'en a pas.

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

Mais le fait est qu’il faut réfléchir à l’ensemble du problème pour devenir un "bon citoyen du Web" et économiser potentiellement de la bande passante pour vous et vos clients.

Je viens de passer en revue tout cela pour un projet Java servant des vidéos à partir d'une base de données, et tout cela fonctionne à merveille.

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

Par exemple, dans mon ancien travail, nous avions une application dans laquelle les utilisateurs joignaient des images à plusieurs points différents d’un rapport qu’ils rédigeaient, et ces images devaient être imprimées à la fin. Ces rapports ont été déplacés via la réplication SQL Server, et cela aurait introduit un énorme casse-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 génération de rapports n'a pas eu à accéder au système de fichiers pour récupérer l'image.

Mon conseil général serait de ne pas vous limiter à une approche ou à une autre - utilisez plutôt la technique qui convient à la situation. Les systèmes de fichiers sont très efficaces pour stocker des fichiers et les bases de données sont très efficaces pour fournir des blocs de données minuscules sur demande. D'un autre côté, l'un des produits de ma société requiert le stockage de l'état complet de l'application dans la base de données, ce qui signifie que les pièces jointes y sont également incluses. 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 les gros clients et les bases de données.

SQL 2008 de Microsoft vous offre le meilleur des deux mondes avec la fonctionnalité FileStream. http://technet.microsoft.com/en-us/library/bb933993.aspx

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

La solution la plus simple / la plus performante / la plus évolutive consiste à stocker vos images sur le système de fichiers. Si la sécurité vous préoccupe, placez-les dans un emplacement inaccessible par le serveur Web et écrivez un script qui gère la sécurité et sert les fichiers.

En supposant que votre serveur Web / application et votre serveur de base de données soient des machines différentes, vous obtiendrez quelques résultats en ajoutant des images dans la base de données: (1) latence du réseau entre les deux machines, (2) surcharge de la connexion à la base de données, (3) consommation une connexion de base de données supplémentaire pour chaque image servie. Je serais plus préoccupé par le dernier point: si votre site contient beaucoup d’images, vos serveurs Web consommeront beaucoup de connexions à la base de données et pourraient épuiser vos pools de connexions.

Si votre application s'exécute sur plusieurs serveurs, je stockais la copie de référence de vos images dans la base de données, puis les mettais en cache à la demande sur les systèmes de fichiers. Cela est beaucoup moins douloureux que d’essayer de synchroniser les systèmes de fichiers latéralement.

Si votre application est sur un seul serveur, ne vous fiez pas au système de fichiers et demandez à la base de données de conserver un chemin d'accès aux données.

Bien entendu, la plupart des bases de données SQL ne sont pas conçues pour servir les images, mais leur utilisation dans la base de données présente un certain confort.

Par exemple, si une base de données est déjà en cours d’exécution et que la réplication est configurée. Vous avez instantanément un magasin d’images haute disponibilité au lieu d’essayer de travailler sur une réplication de système de fichiers basée sur rsync ou nfs. En outre, le fait de créer un ensemble de processus Web (ou de concevoir un nouveau service) pour écrire des fichiers sur un disque accroît un peu votre complexité. Vraiment c'est juste plus de pièces mobiles.

À tout le moins, je vous conseillerais de conserver des "méta" données sur l'image (telles que les autorisations, leur propriétaire, etc.) et les données réelles séparées dans des tables différentes. Il sera donc assez facile de passer à une autre magasin de données sur la ligne. Cela, associé à une sorte de CDN ou de mise en cache, devrait vous donner d’assez bonnes performances jusqu’à un certain point. Je suppose donc que cela dépend de la capacité de cette application à être évolutive et de la manière dont vous conciliez cela avec la facilité de mise en œuvre.

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

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

La récupération après sinistre n’est absolument pas amusante lorsque vous avez des téraoctets de données d’image stockés dans la base de données. Vous feriez mieux de trouver un meilleur moyen de diffuser 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, etc.

Ne le faites pas!

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

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, c'était pour des raisons de sécurité: la suppression d'un enregistrement que je n'aurais pas dû ne pas poser de gros problème, mais la suppression d'un fichier que je n'aurais pas dû aurait peut-être posé problème!

Si les performances devenaient un problème, j'aurais cherché à savoir si la suppression d'un fichier non autorisé était une possibilité réelle ou non.

S'il s'agit d'images qui sont extraites régulièrement de la base de données, j'essaierai toujours d'utiliser le système de fichiers.

Si ce sont des images qui doivent être extraites de temps en temps, et les enregistrer dans la base de données facilite la vie, cela ne me pose aucun problème.

  • base de données pour les données
  • système de fichiers pour les fichiers
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top