database - Stockage d'images dans DB

Translate

J'utilise donc une application qui stocke fortement les images dans la base de données. Quelle est votre opinion à ce sujet? Je suis plus du genre à stocker l'emplacement dans le système de fichiers qu'à le stocker directement dans la base de données.

Selon vous, quels sont les avantages / inconvénients?

This question and all comments follow the "Attribution Required."

Toutes les réponses

Translate

Je suis en charge de certaines applications qui gèrent de nombreux To d'images. Nous avons trouvé que stockerchemins de fichiersdans la base de données pour être le meilleur.

Il y a quelques problèmes:

  • le stockage de la base de données est généralement plus cher que le stockage du système de fichiers
  • you can super-accelerate file system access with standard off the shelf products
    • par exemple, de nombreux serveurs Web utilisent le système d'exploitationenvoyer le fichier()appel système pour envoyer de manière asynchrone un fichier directement du système de fichiers à l'interface réseau. Les images stockées dans une base de données ne bénéficient pas de cette optimisation.
  • des éléments comme les serveurs Web, etc., ne nécessitent aucun codage ou traitement spécial pour accéder aux images dans le système de fichiers
  • databases win out where transactional integrity between the image and metadata are important.
    • il est plus complexe de gérer l'intégrité entre les métadonnées de la base de données et les données du système de fichiers
    • il est difficile (dans le cadre d'une application web) de garantir que les données ont été vidées sur le disque sur le système de fichiers
La source
Rad
Translate

Comme pour la plupart des problèmes, ce n'est pas aussi simple qu'il y paraît. Dans certains cas, il serait judicieux de stocker les images dans la base de données.

  • Vous stockez des images qui changent de façon dynamique, disons des factures et vous vouliez obtenir une facture telle qu'elle était au 1er janvier 2007?
  • Le gouvernement veut que vous mainteniez 6 ans d'histoire
  • Les images stockées dans la base de données ne nécessitent pas de stratégie de sauvegarde différente. Les images stockées sur le système de fichiers
  • Il est plus facile de contrôler l'accès aux images si elles se trouvent dans une base de données. Les administrateurs inactifs peuvent accéder à n'importe quel dossier sur le disque. Il faut un administrateur vraiment déterminé pour fouiner dans une base de données pour extraire les images

D'autre part, il y a des problèmes associés

  • Exiger du code supplémentaire pour extraire et diffuser les images
  • La latence peut être plus lente que l'accès direct aux fichiers
  • Charge plus lourde sur le serveur de base de données
La source
Anna Lee
Translate

Magasin de fichiers. Les ingénieurs de Facebook en ont bien parlé. Une chose à retenir était de connaître la limite pratique des fichiers dans un répertoire.

Aiguille dans une meule de foin: stockage efficace de milliards de photos

La source
Translate

Cela peut être un peu long, mais si vous utilisez (ou prévoyez d'utiliser) SQL Server 2008, je vous recommande de jeter un coup d'œil au nouveauFileStreamType de données.

FileStream résout la plupart des problèmes liés au stockage des fichiers dans la base de données:

  1. Les Blobs sont en fait stockés sous forme de fichiers dans un dossier.
  2. Les Blobs sont accessibles en utilisantSoitune connexion à une base de donnéesorsur le système de fichiers.
  3. Les sauvegardes sont intégrées.
  4. La migration "fonctionne simplement".

Cependant, "Transparent Data Encryption" de SQL ne crypte pas les objets FileStream, donc si c'est une considération, vous feriez peut-être mieux de simplement les stocker en tant que varbinary.

De l'article MSDN:

Les instructions Transact-SQL peuvent insérer, mettre à jour, interroger, rechercher et sauvegarder des données FILESTREAM. Les interfaces du système de fichiers Win32 fournissent un accès en continu aux données.
FILESTREAM utilise le cache système NT pour la mise en cache des données de fichier. Cela permet de réduire tout effet que les données FILESTREAM peuvent avoir sur les performances du moteur de base de données. Le pool de mémoire tampon SQL Server n'est pas utilisé; par conséquent, cette mémoire est disponible pour le traitement des requêtes.

La source
Translate

Les chemins de fichiers dans la base de données sontabsolumentla voie à suivre - j'ai entendu histoire après histoire de clients avec TB d'images que c'était devenu un cauchemar d'essayer de stocker une quantité importante d'images dans une base de données - le succès des performances à lui seul est trop.

La source
Laura Lee
Translate

D'après mon expérience, la solution la plus simple est parfois denommez les images en fonction de la clé primaire. Il est donc facile de trouver l'image qui appartient à un enregistrement particulier, et vice versa. Mais en même temps tu ne stockes pasn'importe quoià propos de l'image dans la base de données.

La source
Regan Lee
Translate

L'astuce ici est de ne pas devenir un fanatique.

Une chose à noter ici est que personne dans le camp du système de fichiers pro n'a répertorié un système de fichiers particulier. Cela signifie-t-il que tout, de FAT16 à ZFS, bat facilement toutes les bases de données?

Non.

La vérité est que de nombreuses bases de données battent de nombreux systèmes de fichiers, même lorsque nous ne parlons que de vitesse brute.

La bonne marche à suivre est de prendre la bonne décision pour votre scénario précis, et pour ce faire, vous aurez besoin de quelques chiffres et d'estimations de cas d'utilisation.

La source
Translate

Dans les endroits où vous DEVEZ garantir l'intégrité référentielle et la conformité ACID, le stockage des images dans la base de données est requis.

Vous ne pouvez pas garantir de manière transactionnelle que l'image et les métadonnées sur cette image stockées dans la base de données font référence au même fichier. En d'autres termes, il est impossible de garantir que le fichier sur le système de fichiers ne sera jamais modifié qu'en même temps et dans la même transaction que les métadonnées.

La source
Andre Lee
Translate

Comme d'autres l'ont dit, SQL 2008 est livré avec un type Filestream qui vous permet de stocker un nom de fichier ou un identifiant en tant que pointeur dans la base de données et stocke automatiquement l'image sur votre système de fichiers, ce qui est un excellent scénario.

Si vous utilisez une base de données plus ancienne, je dirais que si vous la stockez sous forme de données blob, vous n'obtiendrez vraiment rien de la base de données pour rechercher des fonctionnalités, donc c'est probablement mieux pour stocker une adresse sur un système de fichiers et stocker l'image de cette façon.

De cette façon, vous économisez également de l'espace sur votre système de fichiers, car vous n'allez économiser que la quantité exacte d'espace, ou même l'espace compacté sur le système de fichiers.

En outre, vous pouvez décider d'enregistrer avec une structure ou des éléments qui vous permettent de parcourir les images brutes dans votre système de fichiers sans aucun hit de base de données, ou de transférer les fichiers en masse vers un autre système, disque dur, S3 ou un autre scénario - mise à jour de l'emplacement dans votre programme, mais gardez la structure, encore une fois sans trop de succès en essayant de faire sortir les images de votre base de données lorsque vous essayez d'augmenter le stockage.

Probablement, cela vous permettrait également de lancer un élément de mise en cache, basé sur les URL d'image couramment utilisées dans votre moteur / programme Web, de sorte que vous vous enregistrez également là-bas.

La source
Josephine Lee
Translate

Les petites images statiques (pas plus de quelques mégaoctets) qui ne sont pas fréquemment modifiées doivent être stockées dans la base de données. Cette méthode présente plusieurs avantages, notamment une portabilité plus facile (les images sont transférées avec la base de données), une sauvegarde / restauration plus facile (les images sont sauvegardées avec la base de données) et une meilleure évolutivité (un dossier de système de fichiers avec des milliers de petits fichiers miniatures sonne comme un cauchemar d'évolutivité pour moi).

Servir des images à partir d'une base de données est facile, implémentez simplement un gestionnaire http qui sert le tableau d'octets renvoyé par le serveur de base de données comme un flux binaire.

La source
Translate

Voici un livre blanc intéressant sur le sujet.

Vers BLOB ou pas vers BLOB: stockage d'objets volumineux dans une base de données ou un système de fichiers

La réponse est «cela dépend». Cela dépendra certainement du serveur de base de données et de son approche du stockage d'objets blob. Cela dépend également du type de données stockées dans les objets blob, ainsi que de la manière d'accéder à ces données.

Les fichiers de plus petite taille peuvent être efficacement stockés et livrés en utilisant la base de données comme mécanisme de stockage. Les fichiers plus volumineux seraient probablement mieux stockés en utilisant le système de fichiers, surtout s'ils seront modifiés / mis à jour souvent. (La fragmentation des objets blob devient un problème en termes de performances.)

Voici un point supplémentaire à garder à l'esprit. L'une des raisons de l'utilisation d'une base de données pour stocker les objets blob est la conformité ACID. Cependant, l'approche utilisée par les testeurs dans le livre blanc (option Bulk Logged de SQL Server), qui a doublé le débit de SQL Server, a effectivement changé le 'D' dans ACID en un 'd', car les données blob n'étaient pas enregistrées avec les écritures initiales pour la transaction. Par conséquent, si la conformité ACID totale est une exigence importante pour votre système, divisez par deux les chiffres de débit SQL Server pour les écritures de base de données lorsque vous comparez les E / S de fichier aux E / S d'objets blob de base de données.

La source
Baron Lee
Translate

Une chose que je n'ai encore vu personne mentionner, mais qui vaut vraiment la peine d'être notée, c'est qu'il existe également des problèmes associés au stockage de grandes quantités d'images dans la plupart des systèmes de fichiers. Par exemple, si vous adoptez l'approche mentionnée ci-dessus et nommez chaque fichier image après la clé primaire, sur la plupart des systèmes de fichiers, vous rencontrerez des problèmes si vous essayez de mettre toutes les images dans un grand répertoire une fois que vous atteignez un très grand nombre d'images ( par exemple des centaines de milliers ou des millions).

Une solution courante à ce problème est de les hacher dans une arborescence équilibrée de sous-répertoires.

La source
Yetta Lee
Translate

Ce que personne n'a mentionné, c'est que la base de données garantit les actions atomiques, l'intégrité transactionnelle et traite la concurrence. Même l'intégrité référentielle est hors de la fenêtre avec un système de fichiers - alors comment savoir que vos noms de fichiers sont vraiment toujours corrects?

Si vous avez vos images dans un système de fichiers et que quelqu'un lit le fichier pendant que vous écrivez une nouvelle version ou même supprimez le fichier, que se passe-t-il?

Nous utilisons des objets blob car ils sont également plus faciles à gérer (sauvegarde, réplication, transfert). Ils fonctionnent bien pour nous.

La source
Haley Lee
Translate

Le problème avec le stockage uniquement des chemins de fichiers vers les images dans une base de données est que l'intégrité de la base de données ne peut plus être forcée.

Si l'image réelle pointée par le chemin de fichier devient indisponible, la base de données a involontairement une erreur d'intégrité.

Étant donné que les images sont les données réelles recherchées et qu'elles peuvent être gérées plus facilement (les images ne disparaîtront pas soudainement) dans une base de données intégrée plutôt que d'avoir à s'interfacer avec une sorte de système de fichiers (si le système de fichiers est accédé indépendamment, les images PEUVENT soudainement "disparaître"), j'irais les stocker directement sous forme de BLOB ou autre.

La source
Conrad Lee
Translate

Dans une entreprise où je travaillais, nous avons stocké 155 millions d'images dans une base de données Oracle 8i (puis 9i). Une valeur de 7,5 To.

La source
Ward Lee
Translate

Normalement, je suis catégoriquement contre le fait de prendre la partie la plus chère et la plus difficile à mettre à l'échelle de votre infrastructure (la base de données) et d'y mettre toute la charge. D'autre part: cela simplifie considérablement la stratégie de sauvegarde, en particulier lorsque vous avez plusieurs serveurs Web et que vous devez d'une manière ou d'une autre maintenir la synchronisation des données.

Comme la plupart des autres choses, cela dépend de la taille et du budget attendus.

La source
Carol Lee
Translate

Nous avons implémenté un système d'imagerie de documents qui stocke toutes ses images dans des champs blob SQL2005. Il existe actuellement plusieurs centaines de Go et nous constatons d'excellents temps de réponse et peu ou pas de dégradation des performances. En outre, en conformité avec la réglementation, nous avons une couche middleware qui archive les documents récemment publiés dans un système de juke-box optique qui les expose comme un système de fichiers NTFS standard.

Nous avons été très satisfaits des résultats, notamment en ce qui concerne:

  1. Facilité de réplication et de sauvegarde
  2. Capacité à mettre en œuvre facilement un système de gestion des versions de documents
La source
James Lee
Translate

S'il s'agit d'une application Web, le stockage des images sur un réseau de distribution de stockage tiers, tel que S3 d'Amazon ou la plate-forme Nirvanix, pourrait présenter des avantages.

La source
Translate

Hypothèse: l'application est activée sur le Web / basée sur le Web

Je suis surpris que personne n'ait vraiment mentionné cela ... déléguez cela à d'autres spécialistes ->utiliser un fournisseur d'hébergement d'images / de fichiers tiers.

Stockez vos fichiers sur un service en ligne payant comme

Un autre thread StackOverflow en parleici.

Ce filexplique pourquoi vous devriez utiliser un fournisseur d'hébergement tiers.

Ça vaut vraiment le coup. Ils le stockent efficacement. Aucune bande passante n'est téléchargée de vos serveurs vers les demandes des clients, etc.

La source
Veromca Lee
Translate

Si vous n'êtes pas sur SQL Server 2008 et que vous avez de solides raisons de placer des fichiers image spécifiques dans la base de données, vous pouvez adopter l'approche «les deux» et utiliser le système de fichiers comme cache temporaire et utiliser la base de données comme référentiel maître .

Par exemple, votre logique métier peut vérifier si un fichier image existe sur le disque avant de le servir, en récupérant la base de données si nécessaire. Cela vous permet d'acquérir la capacité de plusieurs serveurs Web et de réduire les problèmes de synchronisation.

La source
Marvin Lee
Translate

Je ne sais pas à quel point il s'agit d'un exemple "réel", mais j'ai actuellement une application qui stocke les détails d'un jeu de cartes à collectionner, y compris les images des cartes. Certes, le nombre d'enregistrements pour la base de données n'est que de 2851 enregistrements à ce jour, mais étant donné que certaines cartes ont été publiées plusieurs fois et ont une autre illustration, il était en fait plus efficace de scanner le "carré principal" de l'illustration, puis de manière dynamique générer les effets de bordure et divers pour la carte sur demande.

Le créateur original de cette bibliothèque d'images a créé une classe d'accès aux données qui rend l'image en fonction de la demande, et il le fait assez rapidement pour la visualisation et la carte individuelle.

Cela facilite également le déploiement / les mises à jour lorsque de nouvelles cartes sont publiées, au lieu de compresser un dossier entier d'images et de les envoyer dans le tuyau et de garantir la création de la structure de dossiers appropriée, je mets simplement à jour la base de données et je demande à l'utilisateur de la télécharger à nouveau. Cela mesure actuellement jusqu'à 56 Mo, ce qui n'est pas génial, mais je travaille sur une fonctionnalité de mise à jour incrémentielle pour les versions futures. De plus, il existe une version "sans images" de l'application qui permet à ceux qui utilisent l'accès commuté d'obtenir l'application sans délai de téléchargement.

Cette solution a très bien fonctionné à ce jour puisque l'application elle-même est ciblée comme une seule instance sur le bureau. Il existe un site Web où toutes ces données sont archivées pour un accès en ligne, mais je n'utiliserais en aucun cas la même solution pour cela. Je conviens que l'accès aux fichiers serait préférable car il s'adapterait mieux à la fréquence et au volume des demandes faites pour les images.

J'espère que ce n'est pas trop de bavardages, mais j'ai vu le sujet et je voulais donner mes idées à partir d'une application à petite / moyenne échelle relativement réussie.

La source
Harold Lee
Translate

SQL Server 2008 offre une solution qui a le meilleur des deux mondes:Le type de données filestream.

Gérez-le comme une table ordinaire et bénéficiez des performances du système de fichiers.

La source
Miles Lee
Translate

Cela dépend du nombre d'images que vous allez stocker et de leur taille. J'ai utilisé des bases de données pour stocker des images dans le passé et mon expérience a été assez bonne.

OMI, les avantages de l'utilisation d'une base de données pour stocker des images sont,

A. Vous n'avez pas besoin de la structure FS pour contenir vos images
Les index de base de données fonctionnent mieux que les arborescences FS lorsqu'un plus grand nombre d'éléments doivent être stockés
C.La base de données intelligemment réglée effectue un bon travail de mise en cache des résultats de la requête
D. Les sauvegardes sont simples. Cela fonctionne également bien si vous avez configuré la réplication et que le contenu est fourni à partir d'un serveur proche de l'utilisateur. Dans de tels cas, une synchronisation explicite n'est pas requise.

Si vos images doivent être petites (par exemple <64k) et que le moteur de stockage de votre base de données prend en charge les BLOB en ligne (en enregistrement), il améliore encore les performances car aucune indirection n'est requise (la localité de référence est atteinte).

Le stockage d'images peut être une mauvaise idée lorsque vous avez affaire à un petit nombre d'images de grande taille. Un autre problème avec le stockage d'images dans db est que, les métadonnées telles que la création, les dates de modification doivent être gérées par votre application.

La source
Ingrid Lee
Translate

J'ai récemment créé une application PHP / MySQL qui stocke les fichiers PDF / Word dans une table MySQL (jusqu'à 40 Mo par fichier jusqu'à présent).

Avantages:

  • Les fichiers téléchargés sont répliqués sur le serveur de sauvegarde avec tout le reste, aucune stratégie de sauvegarde distincte n'est nécessaire (tranquillité d'esprit).
  • La configuration du serveur Web est légèrement plus simple car je n'ai pas besoin d'avoir un dossier / upload et de dire à toutes mes applications où il se trouve.
  • J'utilise les transactions pour les modifications afin d'améliorer l'intégrité des données - je n'ai pas à m'inquiéter des fichiers orphelins et manquants

Les inconvénients:

  • mysqldump prend maintenant un temps looooong car il y a 500 Mo de données de fichier dans l'une des tables.
  • Globalement pas très efficace en mémoire / processeur par rapport au système de fichiers

J'appellerais ma mise en œuvre un succès, elle prend en charge les exigences de sauvegarde et simplifie la mise en page du projet. Les performances sont bonnes pour les 20 à 30 personnes qui utilisent l'application.

La source
ila
Translate

Im mon expérience j'ai dû gérer les deux situations: des images stockées dans la base de données et des images sur le système de fichiers avec chemin stocké dans db.

La première solution, les images dans la base de données, est quelque peu «plus propre» car votre couche d'accès aux données devra traiter uniquement des objets de la base de données; mais ce n'est bon que lorsque vous devez faire face à de faibles nombres.

De toute évidence, les performances d'accès à la base de données lorsque vous traitez avec des objets binaires volumineux se dégradent, et les dimensions de la base de données augmenteront beaucoup, entraînant à nouveau une perte de performances ... et normalement l'espace de la base de données est beaucoup plus cher que l'espace du système de fichiers.

D'un autre côté, le fait d'avoir de gros objets binaires stockés dans le système de fichiers vous amènera à avoir des plans de sauvegarde qui doivent prendre en compte à la fois la base de données et le système de fichiers, et cela peut être un problème pour certains systèmes.

Une autre raison d'opter pour le système de fichiers est lorsque vous devez partager vos données d'images (ou sons, vidéos, peu importe) avec un accès tiers: en ce moment, je développe une application Web qui utilise des images auxquelles il faut accéder de "l'extérieur "ma ferme Web de telle sorte qu'un accès à une base de données pour récupérer des données binaires est tout simplement impossible. Alors parfois, il y a aussi des considérations de conception qui vous mèneront à un choix.

Tenez également compte, lors de ce choix, si vous devez gérer l'autorisation et l'authentification lors de l'accès aux objets binaires: ces conditions peuvent normalement être résolues plus facilement lorsque les données sont stockées dans db.

La source
Florence Lee
Translate

J'ai travaillé une fois sur une application de traitement d'image. Nous avons stocké les images téléchargées dans un répertoire qui était quelque chose comme / images / [date du jour] / [numéro d'identification]. Mais nous avons également extrait les métadonnées (données exif) des images et les avons stockées dans la base de données, avec un horodatage et autres.

La source
Violet Lee
Translate

Dans un projet précédent, j'ai stocké des images sur le système de fichiers, ce qui a causé beaucoup de maux de tête avec les sauvegardes, la réplication et la désynchronisation du système de fichiers avec la base de données.

Dans mon dernier projet, je stocke des images dans la base de données et je les mets en cache sur le système de fichiers, et cela fonctionne très bien. Je n'ai eu aucun problème jusqu'à présent.

La source
Samantha Lee
Translate

Deuxièmement, la recommandation sur les chemins de fichiers. J'ai travaillé sur quelques projets qui nécessitaient de gérer des collections d'actifs volumineuses, et toute tentative de stocker des choses directement dans la base de données a entraîné des douleurs et de la frustration à long terme.

Le seul vrai "pro" auquel je puisse penser en ce qui concerne leur stockage dans la base de données est le potentiel de simplification des images individuelles. S'il n'y a pas de chemins de fichiers à utiliser et que toutes les images sont diffusées directement hors de la base de données, il n'y a aucun risque qu'un utilisateur trouve des fichiers auxquels il ne devrait pas avoir accès.

Cela semble être mieux résolu avec un script intermédiaire qui extrait les données d'un magasin de fichiers inaccessible sur le Web. Le stockage DB n'est donc pas VRAIMENT nécessaire.

La source
Tyrone Lee
Translate

Le mot dans la rue est qu'à moins que vous ne soyez un fournisseur de base de données essayant de prouver que votre base de données peut le faire (comme, disons que Microsoft se vantant de Terraserver stockant un bajillion d'images dans SQL Server), ce n'est pas une très bonne idée. Lorsque l'alternative - stocker des images sur des serveurs de fichiers et des chemins dans la base de données est tellement plus facile, pourquoi s'embêter? Les champs Blob sont un peu comme les capacités tout-terrain des SUV - la plupart des gens ne les utilisent pas, ceux qui ont généralement des ennuis, et puis il y a ceux qui le font, mais seulement pour le plaisir.

La source
Translate

Le stockage d'une image dans la base de données signifie toujours que les données d'image se retrouvent quelque part dans le système de fichiers mais sont masquées de sorte que vous ne pouvez pas y accéder directement.

+ ves:

  • intégrité de la base de données
  • c'est facile à gérer car vous n'avez pas à vous soucier de garder le système de fichiers synchronisé lorsqu'une image est ajoutée ou supprimée

-ves:

  • pénalité de performances - une recherche de base de données est généralement plus lente qu'une recherche de système de fichiers
  • vous ne pouvez pas modifier l'image directement (rogner, redimensionner)

Les deux méthodes sont courantes et pratiquées. Jetez un œil aux avantages et aux inconvénients. Dans tous les cas, vous devrez réfléchir à la manière de surmonter les inconvénients. Le stockage dans la base de données signifie généralement peaufiner les paramètres de la base de données et implémenter une sorte de mise en cache. L'utilisation du système de fichiers vous oblige à trouver un moyen de synchroniser le système de fichiers + la base de données.

La source