J'utilise donc une application qui stocke beaucoup d'images dans la base de données. Quelles sont vos perspectives à 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.
Quels sont selon vous les avantages / inconvénients?
Réponses:
Je suis en charge de certaines applications qui gèrent de nombreux To d'images. Nous avons constaté que le stockage des chemins de fichiers dans la base de données était le meilleur.
Il y a quelques problèmes:
la source
Comme pour la plupart des problèmes, ce n'est pas aussi simple qu'il y paraît. Il y a des cas où il serait judicieux de stocker les images dans la base de données.
D'un autre côté, il y a des problèmes associés
la source
Magasin de fichiers. Les ingénieurs de Facebook en ont beaucoup parlé. Une chose à retenir était de connaître la limite pratique des fichiers dans un répertoire.
Aiguille dans une botte de foin: stockage efficace de milliards de photos
la source
Cela peut être un peu long, mais si vous utilisez (ou prévoyez d'utiliser) SQL Server 2008, je vous recommande de jeter un œil au nouveau type de données FileStream .
FileStream résout la plupart des problèmes liés au stockage des fichiers dans la base de données:
Cependant, le "Transparent Data Encryption" de SQL ne crypte pas les objets FileStream, donc si cela est une considération, il vaut mieux les stocker simplement en varbinary.
De l'article MSDN:
la source
Les chemins de fichiers dans la base de données sont certainement la voie à suivre - J'ai entendu des histoires après des clients avec une TB d'images que c'est devenu un cauchemar d'essayer de stocker une quantité importante d'images dans une base de données - le rendement à lui seul est trop.
la source
D'après mon expérience, la solution la plus simple consiste parfois à nommer 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, vous ne stockez rien sur l'image dans la base de données.
la source
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. Est-ce à dire que tout, de FAT16 à ZFS, bat chaque base 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 ligne de conduite consiste à prendre la bonne décision pour votre scénario précis, et pour ce faire, vous aurez besoin de quelques chiffres et de quelques estimations de cas d'utilisation.
la source
Dans les endroits où vous DEVEZ garantir l'intégrité référentielle et la conformité ACID, le stockage d'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 de cette image stockées dans la base de données se réfèrent 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
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 identificateur sous forme de 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 êtes sur une ancienne base de données, je dirais que si vous la stockez en tant que données blob, vous n'allez rien retirer de la base de données pour rechercher des fonctionnalités, il est donc probablement préférable 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 allez uniquement enregistrer 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 db, ou de transférer les fichiers en bloc 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 essayer de faire sortir les images de votre base de données lorsque vous essayez d'augmenter le stockage.
Probablement, cela vous permettrait également de jeter un élément de mise en cache, basé sur les URL des images généralement rencontrées dans votre moteur / programme Web, de sorte que vous vous y enregistriez également.
la source
Les petites images statiques (pas plus de quelques mégas) 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 du 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, il suffit d'implémenter un gestionnaire http qui sert le tableau d'octets renvoyé par le serveur de base de données sous forme de flux binaire.
la source
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épendrait 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 façon dont ces données doivent être accessibles.
Les fichiers de plus petite taille peuvent être stockés et livrés efficacement en utilisant la base de données comme mécanisme de stockage. Les fichiers plus volumineux seraient probablement mieux stockés à l'aide du système de fichiers, surtout s'ils seront souvent modifiés / mis à jour. (La fragmentation des blobs devient un problème en termes de performances.)
Voici un point supplémentaire à garder à l'esprit. L'une des raisons justifiant 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 «d», car les données d'objets blob n'étaient pas enregistrées avec les écritures initiales pour la transaction. Par conséquent, si la conformité ACID complète 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 lors de la comparaison des E / S de fichier aux E / S d'objets blob de base de données.
la source
Une chose que je n'ai encore vu personne mentionner, mais qui vaut vraiment la peine d'être notée, c'est qu'il y a aussi des problèmes lié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 d'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 fois que la solution commune à ce problème consiste à les hacher dans un arbre équilibré de sous-répertoires.
la source
Personne n'a mentionné que la base de données garantit les actions atomiques, l'intégrité transactionnelle et traite de 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 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 blobs car ils sont plus faciles à gérer (sauvegarde, réplication, transfert). Ils fonctionnent bien pour nous.
la source
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 accessible indépendamment, les images POURRAIENT "disparaître" soudainement), j'irais les stocker directement en BLOB ou autre.
la source
Dans une entreprise où je travaillais, nous avons stocké 155 millions d'images dans une base de données Oracle 8i (puis 9i). 7,5 To de valeur.
la source
Normalement, je suis catégorique 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'un autre côté: cela simplifie considérablement la stratégie de sauvegarde, en particulier lorsque vous avez plusieurs serveurs Web et devez en quelque sorte garder les données synchronisées.
Comme la plupart des autres choses, cela dépend de la taille et du budget attendus.
la source
Nous avons implémenté un système d'imagerie documentaire qui stocke toutes ses images dans les champs d'objets blob SQL2005. Il y a actuellement plusieurs centaines de Go et nous constatons d'excellents temps de réponse et peu ou pas de dégradation des performances. De plus, en conformité avec la réglementation, nous avons une couche middleware qui archive les nouveaux documents publiés sur un système de jukebox optique qui les expose comme un système de fichiers NTFS standard.
Nous sommes très satisfaits des résultats, en particulier en ce qui concerne:
la source
S'il s'agit d'une application Web, le stockage des images sur un réseau de livraison de stockage tiers, tel que S3 d'Amazon ou la plate-forme Nirvanix, pourrait présenter des avantages.
la source
Hypothèse: l'application est compatible avec le Web / basée sur le Web
Je suis surpris que personne ne l'ait vraiment mentionné ... déléguez-le à d'autres spécialistes -> utilisez 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 parle ici .
Ce fil explique pourquoi vous devez utiliser un fournisseur d'hébergement tiers.
Ça en vaut vraiment la peine. Ils le stockent efficacement. Pas de bande passante téléchargée depuis vos serveurs vers les demandes des clients, etc.
la source
Si vous n'êtes pas sur SQL Server 2008 et que vous avez de bonnes raisons de placer des fichiers image spécifiques dans la base de données, vous pouvez alors 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 le récupérant de la base de données si nécessaire. Cela vous permet d'acheter plusieurs serveurs Web et de réduire les problèmes de synchronisation.
la source
Je ne sais pas dans quelle mesure il s'agit d'un exemple du "monde 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. Étant donné que 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 des illustrations alternatives, il était en fait plus efficace de scanner le "carré principal" de l'illustration, puis dynamiquement. générer la bordure et divers effets 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 basée sur 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 s'assurer que la structure de dossiers appropriée est créée, je mets simplement à jour la base de données et je demande à l'utilisateur de la télécharger à nouveau. Cela taille actuellement jusqu'à 56 Mo, ce qui n'est pas génial, mais je travaille sur une fonctionnalité de mise à jour incrémentielle pour les futures versions. De plus, il existe une version «sans images» de l'application qui permet à ceux qui se connectent à distance 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 suis d'accord que l'accès aux fichiers serait préférable car il serait mieux adapté à la fréquence et au volume des demandes effectuées pour les images.
J'espère que ce n'est pas trop babiller, mais j'ai vu le sujet et j'ai voulu fournir mes idées à partir d'une application à petite / moyenne échelle relativement réussie.
la source
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 régulière et bénéficiez des performances du système de fichiers.
la source
Cela dépend du nombre d'images que vous allez stocker et également 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 d'utiliser la base de données pour stocker des images sont,
A. Vous n'avez pas besoin de la structure FS pour contenir vos images
B.Les index de base de données fonctionnent mieux que les arbres FS lorsque plus de nombre d'éléments doivent être stockés
C. La base de données bien 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 par un serveur proche de l'utilisateur. Dans de tels cas, une synchronisation explicite n'est pas requise.
Si vos images vont être petites (disons <64k) et que le moteur de stockage de votre base de données prend en charge les BLOBs en ligne (en enregistrement), cela 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 traitez avec 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 comme la création, les dates de modification doivent être gérées par votre application.
la source
J'ai récemment créé une application PHP / MySQL qui stocke des fichiers PDF / Word dans une table MySQL (jusqu'à 40 Mo par fichier jusqu'à présent).
Avantages:
Les inconvénients:
J'appellerais ma mise en œuvre réussie, 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
Im mon expérience, j'ai dû gérer les deux situations: images stockées dans la base de données et 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 les objets de la base de données; mais ce n'est bon que lorsque vous devez faire face à des chiffres faibles.
De toute évidence, les performances d'accès à la base de données lorsque vous traitez des objets binaires volumineux se dégradent, et les dimensions de la base de données augmenteront considérablement, entraînant à nouveau une perte de performances ... et normalement, l'espace de 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 obligera à 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éo, peu importe) avec un accès tiers: de nos jours, je développe une application web qui utilise des images accessibles depuis "l'extérieur". "ma ferme Web de telle manière qu'un accès à la base de données pour récupérer des données binaires est tout simplement impossible. Il y a donc parfois des considérations de conception qui vous conduiront à un choix.
Considérez également, lorsque vous faites ce choix, si vous devez faire face à 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
J'ai déjà travaillé sur une application de traitement d'images. Nous avons stocké les images téléchargées dans un répertoire qui ressemblait à / images / [date d'aujourd'hui] / [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
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 le système de fichiers désynchronisé avec la base de données.
Dans mon dernier projet, je stocke des images dans la base de données et 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
Deuxièmement, la recommandation sur les chemins de fichiers. J'ai travaillé sur quelques projets qui avaient besoin de gérer des collections d'actifs de grande envergure, et toute tentative de stocker des choses directement dans la base de données a entraîné de la douleur 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 la possibilité de faciliter la création d'images individuelles. S'il n'y a pas de chemin de fichier à utiliser et que toutes les images sont diffusées directement depuis la base de données, il n'y a aucun danger qu'un utilisateur trouve des fichiers auxquels il ne devrait pas avoir accès.
Cela semble cependant mieux résolu avec un script intermédiaire tirant les données d'un magasin de fichiers inaccessible sur le Web. Le stockage DB n'est donc PAS VRAIMENT nécessaire.
la source
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, Microsoft se vantant que Terraserver stocke 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 d'accès dans la base de données est tellement plus facile, pourquoi s'embêter? Les champs blob sont un peu comme les capacités hors route des VUS - la plupart des gens ne les utilisent pas, ceux qui ont généralement des ennuis, et puis il y en a qui le font, mais uniquement pour le plaisir.
la source
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 obscurcies de sorte que vous ne pouvez pas y accéder directement.
+ ves:
-ves:
Les deux méthodes sont courantes et pratiquées. Jetez un oeil sur les avantages et les inconvénients. Quoi qu'il en soit, vous devrez réfléchir à la façon 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 nécessite que vous trouviez un moyen de synchroniser le système de fichiers + la base de données.
la source