web-dev-qa-db-fra.com

Est-il préférable de stocker des images dans un BLOB ou simplement l'URL?

Duplicata possible:
Fichiers - dans la base de données ou non?

Je me demandais s'il y avait une bonne raison de continuer à utiliser des champs blob dans une base de données. Il y a quelques années, j'ai travaillé avec une base de données contenant un tas d'images, la base de données était très lente et je ne voyais aucune bonne raison de conserver les images à l'intérieur de la base de données, alors j'ai sorti les images et stocké les noms de fichiers au lieu.

Était-ce une décision intelligente? Que feriez-vous à ma place?

38
eiefai

Comme vous pouvez le voir dans les autres réponses, il s'agit d'un grand "ça dépend". Certains autres facteurs peuvent être si vous payez pour l'hébergement, facturent-ils plus pour le stockage de fichiers ou le stockage de bases de données. Le stockage de fichiers est généralement moins cher, en particulier pour les services cloud.

Si vous êtes auto-hébergé et utilisez SQL Server, la prochaine version, nom de code Denali, étendre FILESTREAM pour permettre l'accès via TSQL et le système de fichiers. Il s'assurera également que ceux-ci restent synchronisés. Vous pouvez accéder, mettre à jour, supprimer de chaque côté et il gardera tout organisé.

Faites vos recherches et découvrez ce qui est important pour vous et choisissez la direction en fonction de ce choix.

30

La raison d'utiliser les BLOB est tout simplement la gérabilité - vous avez exactement une méthode pour sauvegarder et restaurer la base de données, vous pouvez facilement faire des sauvegardes incrémentielles, il n'y a aucun risque que l'image et ses métadonnées stockées dans les tables de base de données ne se désynchronisent , vous disposez également d'une interface de programmation pour exécuter des requêtes ou charger/enregistrer des images, vous n'avez donc pas besoin d'accorder l'accès au système de fichiers des clients distants et vous savez que les mêmes GRANT s'appliqueront aux images et à leurs données associées. De plus, vous avez une méthode de gestion du stockage (par exemple, dans Oracle, vous pouvez tout mettre sur ASM et utiliser Oracle comme LVM pour tout).

Une autre application consiste à mélanger des données relationnelles avec des objets sérialisés (un BLOB peut être n'importe quel binaire, il n'a pas besoin d'être des images). Ou vous pouvez exécuter une requête sur les données de relation et les octets x-y dans le BLOB, qui peut être un en-tête de fichier par exemple. Les applications sont en fait infinies.

Si l'accès à un BLOB a été plus lent que l'accès à votre système de fichiers, il est fort probable que votre base de données ait été mal configurée.

17
Gaius

Je n'utilise pas d'objets blob - principalement du point de vue de la sauvegarde et de la restauration, car je ne veux pas que les données blob ralentissent mes sauvegardes.

Je ne stocke pas d'URL complète, cependant ... Je ne stocke que le chemin de fichier en dessous d'un certain point, et je crée le chemin car j'ai plus d'une façon dont les gens et les programmes accèdent à mes fichiers (FTP, HTTP, répertoire local, Répertoires montés NFS).

... bien sûr, je traite probablement des images plus grandes et plus grandes que la plupart des gens ... un de mes ensembles de données reçoit environ 700 Go d'images (compressées) par jour. Mais même les vignettes de ces images, je les stocke toujours en externe.

13
Joe

Je suis un grand fan du stockage de la copie "de référence" de l'image dans la base de données - du point de vue de la gestion/reprise après sinistre, c'est vraiment la façon de voler.

Maintenant, vous pouvez toujours faire beaucoup de choses pour servir l'image du système de fichiers pour la plupart des applications, donc vous n'exercez pas trop de pression sur le serveur de base de données lui-même pour faire des choses qu'il ne veut pas vraiment faire.

8
Wyatt Barnett

Si vous travaillez avec Linux, le stockage des images dans le système de fichiers et non dans la base de données a de meilleures performances significatives, voir cet extrait du livre de Brad Ediger Advanced Rails .

8
j.p.

Je ne suis pas très fan du stockage d'images dans la base de données. Dans une petite application avec quelques utilisateurs, cela semble être une solution facile, mais lorsque vous commencez à évoluer, cela rend les choses plus difficiles.

Ma préférence est de commencer par stocker des images dans un dossier sur le serveur Web, mais de conserver le chemin d'accès dans une configuration facilement accessible afin que, lorsque j'en ai besoin, je puisse les déplacer rapidement vers leur propre serveur d'images optimisé et dédié. Plus tard, je pourrais vouloir les déplacer ailleurs (pensez S3 ou Akamai) de la même manière. Tout cela est beaucoup plus compliqué si je dois changer le code qui s'attendait à les lire dans la base de données.

5
phred

Était-ce une décision intelligente?

Si c'était une décision intelligente ou non, cela dépend de votre cas spécifique:

Si l'emplacement du fichier affecte directement toute structure d'URL ou si vous stockez des adresses de fichier complètes dans la base de données (mauvaises), je peux dire que c'était un mauvais mouvement car vous aurez des problèmes au cas où quelqu'un déplacerait ou renommerait un répertoire.

Mais comme Mais si votre application est construite de manière à simplement pointer le répertoire des fichiers et que la logique d'accès aux fichiers est dynamique, vous avez fait un choix intelligent pour les raisons suivantes:

  • Avec le stockage de la base de données, s'il est nécessaire de traiter un grand nombre d'images par demande, vous augmenterez le temps de réponse de votre application car les fichiers seront envoyés de manière synchrone au réseau. Vous ajouterez également un peu plus de traitement à votre serveur.

  • Le stockage de fichiers est généralement moins cher que le stockage de base de données.

  • Avec le stockage de fichiers (sauf s'il existe des restrictions à l'accès aux images: seul un utilisateur déterminé peut accéder à un groupe d'images donné), aucun traitement n'est nécessaire pour accéder aux images ou à tout autre type de fichier.

  • Avec le stockage de base de données, il n'est pas possible d'accéder à vos fichiers via FTP (assez évident, mais il est bon de s'en souvenir).

  • Le stockage des fichiers de base de données ralentira et/ou encombrera vos sauvegardes périodiques de base de données.

Que feriez-vous à ma place?

Je garderais cette décision à moins qu'un facteur dominant contraire n'apparaisse.

J'espère que cela pourra aider.

4
marcio