219 votes

Stocker des images dans le serveur SQL ?

J'ai créé un petit site de démonstration et j'y stocke des images dans une colonne d'images sur le serveur SQL. J'ai quelques questions à poser...

  • Est-ce une mauvaise idée ?

  • Cela affectera-t-il les performances de mon site lorsqu'il se développera ?

L'alternative serait de stocker l'image sur le disque et de ne conserver que la référence à l'image dans la base de données. Il doit s'agir d'un dilemme commun à de nombreuses personnes. Je serais ravi d'avoir des conseils et je serais même heureux de faire moins d'erreurs si je le pouvais.

8 votes

Y a-t-il un nouvel ajout pour cette question en 2017 ? Est-ce toujours valable à ce jour ?

305voto

marc_s Points 321990

Il y a un très bon article de Microsoft Research appelé To Blob or Not To Blob .

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

  • si vos images ou vos documents ont une taille inférieure à 256 Ko, il est plus efficace de les stocker dans une colonne VARBINARY de la base de données.

  • si vos images ou vos documents font généralement plus de 1 Mo, il est plus efficace de les stocker dans le système de fichiers (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 les deux, c'est un peu à pile ou face en fonction de l'utilisation que vous en faites.

Si vous décidez de mettre vos photos dans une table SQL Server, je vous recommande fortement d'utiliser une table séparée pour stocker ces photos - ne stockez pas la photo de l'employé dans la table employee - gardez-les dans une table séparée. De cette façon, la table Employé peut rester mince et efficace, en supposant que vous n'avez pas toujours besoin de sélectionner la photo de l'employé, aussi, dans le cadre de vos requêtes.

Pour les groupes de fichiers, consultez Fichiers et architecture des groupes de fichiers pour une introduction. En gros, vous pouvez soit créer votre base de données avec un groupe de fichiers séparé pour les grandes structures de données dès le début, soit ajouter un groupe de fichiers supplémentaire plus tard. Appelons-le "LARGE_DATA".

Désormais, chaque fois que vous devez créer une nouvelle table 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

Consultez l'introduction MSDN sur les groupes de fichiers, et jouez avec !

0 votes

Est-ce une bonne ou une mauvaise chose ? .... - si vos images ou vos documents font généralement plus de 1 Mo, il est plus efficace de les stocker dans le système de fichiers (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).

0 votes

Excellente réponse. Si vous avez envie d'expliquer en détail pourquoi vous recommandez d'utiliser une table dédiée pour les données d'image, j'ai a créé une question distincte pour cela sur dba.SE .

17voto

kevin9794 Points 345

J'ai été confronté à ce dilemme une fois, et j'ai fait de nombreuses recherches sur Google pour obtenir des avis. Ce que j'ai trouvé, c'est qu'en effet, beaucoup considèrent que la sauvegarde des images sur disque est meilleure pour les grandes images, tandis que mySQL permet un accès plus facile, en particulier à partir de langages comme PHP.

J'ai trouvé une question similaire

MySQL BLOB ou fichier pour le stockage de petites images PNG ?

Mon verdict final était que pour des choses comme une photo de profil, juste une petite image carrée qui doit être là par utilisateur, mySQL serait mieux que de stocker un tas de thumbs dans le disque dur, tandis que pour les albums photo et des choses comme ça, les dossiers/fichiers d'images sont mieux.

J'espère que cela vous aidera

15voto

Erling Ervik Points 139

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

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

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

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

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

Juste mes deux centimes.

4 votes

Bon point. Les sauvegardes des images sont tout aussi importantes que celles des bases de données... parfois même plus.

0 votes

Les images sur le système de fichiers ont également besoin d'autorisations réseau.

4 votes

Les autorisations de réseau sont un bon point. Mais je ne vois pas le cas où vous n'auriez qu'une sauvegarde de la base de données. Vous auriez sûrement une sauvegarde de l'application et des fichiers. Vous pouvez tout aussi bien perdre la base de données et conserver les fichiers.

15voto

John Hartsock Points 36565

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 de manière à ce que la colonne image réside dans un fichier distinct.

Pour en savoir plus sur l'utilisation des groupes de fichiers, cliquez ici. http://msdn.microsoft.com/en-us/library/ms179316.aspx .

13voto

Zailon Xwadastet Points 131

Lors du stockage des images dans le serveur SQL n'utilisez pas le type de données 'image'. Selon MS, cette fonction est progressivement éliminée dans les nouvelles versions du serveur SQL. Utilisez varbinaire(max) au lieu de

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X