web-dev-qa-db-fra.com

Stocker des images dans SQL Server?

J'ai créé un petit site de démonstration sur lequel je stocke des images dans une colonne d'images du serveur SQL. Quelques questions que j'ai sont ...

  • Est-ce une mauvaise idée?

  • Est-ce que cela affectera les performances sur mon site quand il grandira?

L'alternative serait de stocker l'image sur le disque et de ne stocker que la référence à l'image dans la base de données. Ce doit être un dilemme commun que beaucoup de gens ont eu. Je serais heureux de recevoir quelques conseils et serais heureux de faire moins d'erreur si je le pouvais.

175
marko

Il existe un très bon article de Microsoft Research intitulé To Blob or Not To Blob .

Leur conclusion après un grand nombre de tests de performance et d’analyses est la suivante:

  • si la taille de vos images ou de votre document est généralement inférieure à 256 Ko, leur stockage dans une colonne de base de données est plus efficace.

  • si la taille de vos images ou de votre document est généralement supérieure à 1 Mo, leur stockage dans le système de fichiers est plus efficace (et avec l'attribut FILESTREAM de SQL Server 2008, ils sont toujours sous contrôle transactionnel et font partie de la base de données).

  • entre ces deux-là, c'est un peu un mélange en fonction de votre utilisation

Si vous décidez de placer vos images dans une table SQL Server, il est vivement recommandé d'utiliser une table distincte pour stocker ces images. Ne stockez pas la photo de l'employé dans la table des employés. Conservez-les dans une table séparée. De cette manière, la table des employés peut rester maigre, moyenne et très efficace, en supposant que vous n’ayez pas toujours besoin de sélectionner la photo de l’employé dans vos requêtes.

Pour les groupes de fichiers, consultez Fichiers et architecture de groupe de fichiers pour une intro. Fondamentalement, vous devez créer votre base de données avec un groupe de fichiers distinct pour les grandes structures de données dès le début ou ajouter un groupe de fichiers supplémentaire ultérieurement. Appelons-le "LARGE_DATA".

Maintenant, chaque fois que vous avez une nouvelle table à créer qui doit stocker des colonnes VARCHAR (MAX) ou VARBINARY (MAX), vous pouvez spécifier ce groupe de fichiers pour les données volumineuses:

 CREATE TABLE dbo.YourTable
     (....... define the fields here ......)
     ON Data                   -- the basic "Data" filegroup for the regular data
     TEXTIMAGE_ON LARGE_DATA   -- the filegroup for large chunks of data

Découvrez l’introduction de MSDN sur les groupes de fichiers et jouez avec!

239
marc_s

Je suis tombé dans ce dilemme une fois et j'ai beaucoup cherché sur Google pour avoir des opinions. Ce que j’ai trouvé, c’est que beaucoup voient mieux sauvegarder les images sur disque pour les grandes images, alors que MySQL permet un accès plus facile, en particulier depuis des langages tels que PHP.

J'ai trouvé une question similaire

MySQL BLOB vs File pour stocker de petites images PNG?

Mon verdict final était que pour des choses telles que la photo de profil, juste une petite image carrée devant être présente par utilisateur, mySQL serait mieux que de stocker plusieurs pouces dans le disque dur, tandis que pour les albums photo et autres choses du même genre, les dossiers/Les fichiers image sont meilleurs.

J'espère que ça aide

14
Kevin Chavez

Je préférerais stocker l'image dans un répertoire, puis stocker une référence au fichier image dans la base de données.

Toutefois, si vous stockez l'image dans la base de données, vous devez partitionner votre base de données pour que la colonne image se trouve dans un fichier séparé.

Vous pouvez en savoir plus sur l’utilisation des groupes de fichiers ici http://msdn.Microsoft.com/en-us/library/ms179316.aspx .

13
John Hartsock

Lorsque vous stockez des images sur SQL Server , n'utilisez pas le type de données 'image' . Selon MS, il est progressivement supprimé dans les nouvelles versions de SQL Server. Utilisez plutôt varbinary (max)

https://msdn.Microsoft.com/en-us/library/ms187993.aspx

10
Zailon Xwadastet

Pourquoi il peut être bon de stocker des images dans la base de données et non dans un catalogue sur le serveur Web.

Vous avez créé une application contenant de nombreuses images stockées dans un dossier du serveur, que le client utilise depuis des années.

Maintenant, ils viennent à vous. Leur serveur a été détruit et ils doivent le restaurer sur un nouveau serveur. Ils n'ont plus accès à l'ancien serveur. La seule sauvegarde dont ils disposent est la sauvegarde de la base de données.

Vous avez bien sûr le source et pouvez le déployer simplement sur le nouveau serveur, installer SqlServer et restaurer la base de données. Mais maintenant, toutes les images ont disparu.

Si vous avez enregistré les images dans SqlServer, tout fonctionnera comme avant.

Juste mes 2 cents.

9
Erling Ervik

Une autre option est sortie en 2012 sous le nom de table de fichiers: https://msdn.Microsoft.com/en-us/library/ff929144.aspx

7
Cyrus Downey

Bien que les problèmes de performances soient valables, les vraies raisons pour lesquelles vous devriez éviter de stocker des images dans une base de données sont, pour des raisons de gestion de la base de données. Votre base de données va croître très rapidement et les bases de données coûtent beaucoup plus que le simple stockage de fichiers. Les sauvegardes et les restaurations de bases de données sont beaucoup plus coûteuses et prennent beaucoup de temps que les restaurations de sauvegarde de fichiers. À la rigueur, vous pouvez restaurer une base de données plus petite beaucoup plus rapidement que celle contenant trop d'images. Comparez 1 TB du stockage de fichiers sur Azure à une base de données 1 TB et vous verrez la grande différence de coût.

2
J Miglietta