9
votes

Stockage d'images sur une base de données

Dupliqué possible:
Stockage d'images dans DB - Oui ou Nay?

Pour les âges, on m'a dit de ne pas stocker des images sur la base de données, ni de Big Blob de cette affaire. Bien que je puisse comprendre pourquoi les bases de données ne sont pas / n'étaient pas efficaces pour cela, je n'ai jamais compris pourquoi ils ne pouvaient pas. Si je peux mettre un fichier quelque part et référencer cela, pourquoi le moteur de base de données n'a pas pu faire de même. Je suis content Damien Katz l'a mentionné sur un récent podcast de dépassement de pile et de Joel Spolsky et Jeff Atwood, au moins en silence, d'accord.

J'ai lu des allusions que Microsoft SQL Server 2008 devrait être capable de gérer les blobs efficaces, est-ce vrai? Si oui, qu'est-ce que nous nous arrêtons de stocker des images là-bas et de se débarrasser d'un problème? Une chose que je peux penser, c'est que lorsque l'image peut être servie par un serveur Web statique très rapidement s'il s'agit d'un fichier quelque part, lorsqu'il est dans la base de données, il doit voyager de la base de données à l'application Web Server (qui pourrait être plus lente que le serveur Web statique), puis il est servi. Ne devrait pas mettre en cache d'aide / résoudre ce dernier problème?


2 commentaires

5 Réponses :


10
votes

Oui, c'est vrai, SQL Server 2008 vient de mettre en œuvre une fonctionnalité comme celle que vous mentionnez, elle s'appelle une filtream. Et c'est un bon argument en effet pour stocker des blobs dans une dB, si vous êtes certain que vous ne voudriez que utiliser SQL Server pour votre application (ou êtes prêt à payer le prix dans les performances ou au développement d'une couche similaire sur le nouveau nouveau. Serveur DB). Bien que je pense que je m'attends à ce que des couches similaires commencent à apparaître si elles n'existent pas déjà pour différents serveurs de DB.

Comme toujours ce que les vrais avantages dépendent du scénario particulier. Si vous servirez beaucoup de relativement statiques, de gros fichiers, ce scénario plus la mise en cache sera probablement la meilleure option en tenant compte d'une combinaison de performances / de gestion de la facilité.

Ce livre blanc décrit la fonction FileStream de SQL Server 2008, qui permet de stocker et d'accéder efficacement aux données de blob à l'aide d'une combinaison de SQL Server 2008 et du système de fichiers NTFS. Il couvre les choix de stockage BLOB, configurez Windows et SQL Server pour utiliser des données FILESTREM, des considérations de combinaison de filestream avec d'autres fonctionnalités et des détails de mise en œuvre tels que partitionnement et performances.


1 commentaires

C'est une bonne réponse, je suppose que je devrais supprimer le mien, vous enfermer dans des NTF et des détails de mise en œuvre complexes assez douloureux, mais je pouvais penser à certaines solutions qui pourraient l'appeler.



0
votes

Il existe des options dans SQL Server pour gérer l'endroit où il stocke de grandes blobs de données, ceux-ci y ont été là depuis au bail SQL2005, donc je ne sais donc pas pourquoi vous ne pouviez pas stocker de gros blobs de données. Mousse par exemple stocke tous les documents que vous avez téléchargés dans une base de données SQL.

Il y a bien sûr des conséquences sur la performance, comme avec à peu près n'importe quoi, vous devez donc prendre soin de ne pas récupérer le blob si vous n'en avez pas besoin et n'inclut pas les index, etc.


2 commentaires

Les filtres sont neufs en 2008. Les gesteils font une énorme différence sur le Varbinary clair, vérifiez le lien de ma réponse.


Oui et ils seraient mieux. Mais Moss (Microsoft Office SharePoint Server) s'installe sur SQL 2005 et il stocke les documents informatiques de la base de données, donc il doit également y avoir des fonctionnalités en 2005.




1
votes

L'une des raisons classiques de la prudence sur le stockage des blobs dans des bases de données est que les données seront stockées et modifiées (modifiées) sous contrôle des transactions, ce qui signifie que le SGBD doit s'assurer que les changements de restauration et récupéreront les changements après un crash. Cela se fait normalement par une certaine variation du thème d'un journal de transaction. Si le SGBM consiste à enregistrer la modification d'un blob de 2 Go, il doit avoir une façon d'identifier ce qui a changé. Cela pourrait être simple d'esprit (l'image avant et l'image après l'image) ou plus sophistiquée (une sorte d'opération de delta binaire) plus coûteuse. Malgré tout, parfois, le résultat net sera des gigaoctets de données à stocker à travers les journaux. Cela fait mal aux performances du système. Il existe différentes manières de limiter l'impact des changements - réduisant la quantité de données qui traversent les journaux - mais il existe des compromis.

La pénalité pour stocker des noms de fichiers dans la base de données est que le SGBD n'a aucun contrôle (en général) au cours de laquelle les fichiers changent - et de nouveau, la reproductibilité des données est compromise; Vous ne pouvez pas garantir que quelque chose en dehors de la SGBD n'a pas changé les données. (Il y a une version très générale de cet argument - vous ne pouvez pas être sûr que quelqu'un n'a pas altéré les fichiers de stockage de la base de données en général. Mais je parle de stocker un nom de fichier dans la base de données faisant référence à un fichier non contrôlé par le fichier. DBMS. Les fichiers contrôlés par les SGBM sont protégés contre les changements occasionnels par les départs non privilégiés.)

La nouvelle fonctionnalité SQL Server semble intéressante. Je n'ai pas exploré ce que cela le fait, je ne peux donc pas commenter dans la mesure où elle évite ou limite les problèmes mentionnés ci-dessus.


0 commentaires

2
votes

Je vais essayer de décomposer votre question et d'aborder vos différentes parties au mieux que je peux.

  • SQL Server 2008 et le type filtream - La réponse de Vinko ci-dessus est la meilleure que j'ai vue jusqu'à présent. Le type filtream est le SQL Server 2008 est ce que vous recherchiez. FileStream est dans la version 1, il reste donc quelques raisons pour lesquelles je ne recommanderais pas d'utiliser si une demande d'entreprise. À titre d'exemple, mon souvenir est que vous ne pouvez pas scinder le stockage des fichiers physiques sous-jacents sur plusieurs chemins de Windows UNC. Tôt ou tard, cela deviendra une contrainte assez grave pour une application d'entreprise.

  • stocker des fichiers dans la base de données - dans le schéma grand-père des choses, la direction originale de Damien Katz était correcte. La plupart des joueurs de la gestion de contenu de grandes entreprises (ECM) stockent des fichiers sur le système de fichiers et les métadonnées de la SGBDM. Si vous allez encore plus grand et regardez le service S3 de Amazon, vous envisagez des fichiers physiques avec un backend de base de données non relationnel. Sauf si vous ne mesuez pas vos fichiers sous Stockage dans les milliards, je ne recommanderais pas d'aller à cet itinéraire et de rouler le vôtre.

  • Un peu plus de détails sur les fichiers de la base de données - à première vue, beaucoup de choses parlent pour des fichiers de la base de données. L'une est la simplicité, deux est une intégrité transactionnelle. Étant donné que le système de fichiers Windows ne peut pas être enrôlé dans une transaction, l'écriture doit avoir lieu dans l'ensemble de la base de données et du système de fichiers doit avoir une logique de compensation de transaction intégrée. Je n'ai pas vraiment vu l'autre côté de l'histoire jusqu'à ce que je parlais à DBAS. Ils n'aiment généralement pas que les données commerciales et les blobs d'entreprise (sauvegarde devient douloureuse) Donc, à moins que vous n'ayez une base de données séparée dédiée au stockage de fichiers, cette option n'est généralement pas aussi attrayante pour les DBA. Vous avez raison que la base de données sera plus rapide, toutes les autres choses étant égales. Ne sachant pas le cas d'utilisation pour votre demande, je ne peux pas dire grand chose à propos de l'option de mise en cache. Il suffit de dire que dans de nombreuses applications d'entreprise, le taux de frappe de cache sur les documents est trop faible pour justifier de les mettre en cache.

    J'espère que cela aide.


1 commentaires

Une dernière note de bas de page. Si vous optez sur la route du système de fichiers, soyez prudent avec les limitations à la quantité de fichiers pouvant être stockés dans un seul dossier physique et la longueur maximale du chemin du fichier. J'ai frappé ces deux limitations au fil des ans, une fois exigeant qu'un correctif de registre Microsoft pour supprimer une limitation.