Stocker des images sous forme de fichiers ou dans la base de données pour une application Web?

125

Ma question est assez générique et je sais qu'il n'y aura peut-être pas de réponse à 100%. Je construis une solution Web ASP .NET qui comprendra beaucoup d'images et, espérons-le, une bonne quantité de trafic. Je veux vraiment atteindre la performance.

Dois-je enregistrer les images dans la base de données ou sur le système de fichiers? Et quelle que soit la réponse, je suis plus intéressé par pourquoi choisir une manière spécifique.

Merci beaucoup, Stefan

DUPLICATE : Stockage d'images dans DB - Oui ou non? , Comment stocker des images dans votre système de fichiers , Stocker un petit nombre d'images: blob ou fs? et probablement quelques autres.


COMMENTAIRE: Merci pour beaucoup de bonnes réponses. Je vais opter pour une solution basée sur des fichiers même si j'aime l'idée d'avoir une solution 100% basée sur une base de données. Il semble qu'il existe aujourd'hui de bonnes solutions pour faire ce que je veux avec les bases de données, etc. mais j'ai quelques raisons pour ne pas le faire.

  • Je serai sur une solution hébergée, j'ai une énorme quantité de stockage (10 Go) mais seulement 300 Mo pour la base de données. Le stockage supplémentaire dans la base de données coûtera cher.

  • Je ne suis pas un expert de la base de données et je ne contrôle pas non plus les paramètres de la base de données. Une solution basée sur la base de données peut nécessiter une configuration personnalisée telle qu'elle ressemble.

Si nous allons passer à exécuter le site sur notre propre serveur, je pourrais envisager une solution basée sur la base de données. merci, Stefan

StefanE
la source
1
Veuillez spécifier la base de données que vous utilisez.
Gerrie Schenck
1
J'ai l'intention d'utiliser MSSQL d'une version ultérieure.
StefanE
1
@StefanE, Le système de fichiers est, à toutes fins utiles, une base de données spécialisée optimisée pour le stockage de fichiers.
LukeH

Réponses:

175

Stockez les images sur le système de fichiers et les emplacements des images dans la base de données.

Pourquoi? Car...

  1. Vous pourrez servir les images sous forme de fichiers statiques.
  2. Aucun accès à la base de données ou code d'application ne sera nécessaire pour récupérer les images.
  3. Les images pourraient être servies à partir d'un serveur différent pour améliorer les performances.
  4. Cela réduira le goulot d'étranglement de la base de données.
  5. La base de données stocke finalement ses données sur le système de fichiers.
  6. Les images peuvent être facilement mises en cache lorsqu'elles sont stockées sur le système de fichiers.
Akbar ibrahim
la source
1
En outre, dans SQL Server, lorsque vous stockez l'image en tant que champ «Image», c'est effectivement ce que fait SQL: stocker un pointeur vers le fichier sur le disque quelque part. C'est ainsi qu'il contourne la limite de page de 8 Ko.
Zhaph - Ben Duguid
9
Ce problème a été résolu est SQL Server 2008. Il y avait un nouveau type introduit FILESTREAM technet.microsoft.com/en-us/library/bb895234.aspx qui permet de tirer parti des «performances du système de fichiers et en même temps de maintenir cohérence transactionnelle entre les données non structurées et les données structurées correspondantes "
kristof
Oui, vous avez raison. ma question est quelle est la taille du blob? ou combien de mémoire il peut stocker?
Ameer
11

Dans mes projets récemment développés, j'ai stocké des images (et toutes sortes de documents binaires) sous forme de colonnes d'images dans des tables de base de données.

L'avantage d'avoir des fichiers stockés dans la base de données est évidemment que vous ne vous retrouvez pas avec des fichiers non référencés sur le disque dur si un enregistrement est supprimé, car la synchronisation entre la base de données (= méta-données) et le disque dur (= stockage de fichiers) n'est pas intégrée et doit être programmé manuellement.

En utilisant la technologie actuelle, je vous suggère de stocker des images dans des colonnes FILESTREAM de SQL Server 2008 (du moins c'est ce que je vais faire avec mon prochain projet), car elles combinent l'avantage de stocker des données dans une base de données ET d'avoir de gros binaires dans des fichiers séparés (à moins selon la publicité;))

devio
la source
Avez-vous déjà testé la fonctionnalité Filestream?
StefanE
1
En fait, lors de la suppression d'un enregistrement DB, il peut également être codé pour supprimer du système de fichiers. Donc, je trouve bon de stocker dans FS plutôt que dans DB
kailash19
9

L'adage a toujours été "Fichiers dans le système de fichiers, métadonnées de fichier dans la base de données"

Matt Darby
la source
6

Mieux vaut stocker les fichiers sous forme de fichiers. Différentes bases de données traitent les données Blob différemment, donc si vous devez migrer votre back-end, vous risquez d'avoir des problèmes.

Lors du service des impages, un <img src = vers un fichier qui existe déjà sur le serveur sera probablement plus rapide que de créer un fichier temporaire à partir du champ de la base de données et de pointer la balise <img vers celui-ci.

J'ai trouvé cette réponse en recherchant votre question sur Google et en lisant les commentaires sur http://databases.aspfaq.com/database/should-i-store-images-in-the-database-or-the-filesystem.html

étincelles
la source
1
le message référé semble un peu dépassé.
devio
6

J'aime généralement avoir des fichiers binaires dans la base de données parce que:

  • intégrité des données: pas de fichier non référencé, pas de chemin dans la base de données sans aucun fichier associé
  • cohérence des données: faites un vidage de la base de données et c'est tout. non "O j'ai oublié de targz ce répertoire de données."
chburd
la source
4

Le stockage d'images dans la base de données ajoute une surcharge de base de données pour servir des images uniques et rend difficile le déchargement vers un stockage alternatif (S3, Akami) si vous atteignez ce niveau. En les stockant dans la base de données, il est beaucoup plus facile de déplacer votre application vers un autre serveur, car seule la base de données doit être déplacée maintenant.

Le stockage d'images sur le disque facilite le déchargement vers un stockage alternatif, rend les éléments statiques pour que vous n'ayez pas à vous soucier des en-têtes HTTP dans votre application Web pour rendre les images mises en cache. L'inconvénient est que si jamais vous déplacez votre application vers un autre serveur, vous devez également vous rappeler de déplacer les images; quelque chose qui est facilement oublié.

Adam Hawes
la source
3

Pour les applications Web, vous obtiendrez de meilleures performances en utilisant le système de fichiers pour stocker vos images. Cela vous permettra de mettre en œuvre facilement la mise en cache des images à plusieurs niveaux au sein de votre application. Le stockage d'images dans une base de données présente certains avantages, mais la plupart du temps, ces avantages sont associés aux applications client.

Dillie-O
la source
0

Juste pour ajouter un peu plus aux réponses déjà bonnes jusqu'à présent. Vous pouvez toujours obtenir les avantages de la mise en cache à la fois au niveau du Web peut - être et le niveau de base de données si vous allez l'itinéraire que vous garder des images dans la base de données.

Je pense que pour la base de données, vous pouvez y parvenir en stockant les images par rapport aux données textuelles qui leur sont associées et si vous pouvez accéder aux images dans une requête particulière afin que la base de données puisse mettre en cache la requête (juste de la théorie n'hésitez pas à me bombarder sur cette partie).

Avec le côté web, je suppose que puisque votre question est balisée avec asp.net que vous iriez dans la voie de l'utilisation d'un gestionnaire http pour servir les images. Ensuite, vous avez tous les avantages du framework à votre disposition et vous pouvez garder votre logique de domaine plus propre en n'ayant qu'à passer la clé de votre image au gestionnaire http.

MotoWilliams
la source
-1

Pourquoi ne pas choisir une base de données NoSql individuelle pour stocker vos fichiers.

Il vous apporte l'intégrité des données, la cohérence des données comme @chburd l'a mentionné.

Alors que vous rdbms, restez petit.

Will Wu
la source
-1
  1. Voici un exemple étape par étape (approche générale, implémentation Spring Eclipse) de stockage d'images dans un système de fichiers et de conservation de leurs métadonnées dans DB - http://www.devmanuals.com/tutorials/java/spring/spring3/mvc /Spring3MVCImageUpload.html
  2. Voici également un exemple - http://www.journaldev.com/2573/spring-mvc-file-upload-example-tutorial-single-and-multiple-files
  3. Vous pouvez également étudier une base de code de ce projet - https://github.com/jdmr/fileUpload . Faites attention à ce contrôleur.
Lord Nighton
la source