2010-07-21 6 views
16

Je construis une application mvc asp.net où les utilisateurs peuvent joindre une image à leur profil, mais aussi dans d'autres zones du système comme un gadget de messagerie sur le tableau de bord qui affiche les messages récents, etc.Enregistrer des images de profil utilisateur sur le disque ou dans la base de données?

Lorsque l'utilisateur télécharge ces je me demande s'il serait préférable de les stocker dans la base de données ou sur le disque.

avantages Databse

  • facile à base de données complète de sauvegarde et de maintenir le contenu du profil/images avec des tables profil/utilisateur associés

  • quand je construis des services Web plus tard sur la piste, ils peuvent tout simplement extraire toutes les données relatives à un point de la base (la base de données)

avantages Filesystem

  • fichiers de chargement à partir du disque est probablement plus rapide

  • d'autres avantages?

Où d'autres sites stockent ce type d'informations. Ai-je raison d'être un peu préoccupé par la performance de la base de données pour quelque chose comme ça?

Peut-être y aurait-il un moyen de mettre en cache les images extraites de la base de données pendant un certain temps? Sinon, qu'en est-il de l'idée de stocker ces images dans la base de données, mais de les copier en mode miroir afin que le serveur Web puisse les charger à partir de là? Cela semblerait donner à la fois la sauvegarde et la commodité d'un Db, tout en donnant les avantages de vitesse des fichiers sur le disque.

Infrastructure en question

  • Le site sera déployé à IIS sur Windows Server 2003 exécutant le système de fichiers NTFS.
  • La base de données sera SQL Server 2008

Résumé

autour de la lecture sur un grand nombre de sujets connexes ici sur le SO, beaucoup de gens sont maintenant une tendance vers le type SQL Server Filestream. De ce que j'ai pu rassembler cependant (je peux me tromper), il n'y a pas beaucoup d'avantages quand les fichiers sont assez petits. Filestreaming semble cependant grandement améliorer les performances lorsque les fichiers sont plusieurs Mo ou plus. Comme mes images de profil tendent à s'asseoir autour ~ 5kb j'ai décidé de les laisser simplement stockés dans un filestore dans la base de données comme varbinary (max).

Dans ASP.NET MVC, j'ai constaté un léger problème de performance renvoyant FileContentResults pour les images extraites de la base de données de cette manière. J'ai donc mis en cache le fichier sur le disque lorsqu'il est lu si l'emplacement de ce fichier n'est pas trouvé dans le cache de l'application.

Donc je suppose que je suis allé pour un hybride;

  • stockage de base de données pour faire cuire jusqu'à des données plus faciles et les fichiers sont liés directement aux profils
  • copie ombre sur le disque pour permettre une meilleure mise en cache

À tout moment, je peux supprimer le dossier de cache sur le disque et comme les images sont re-demandées, elles seront recopiées dès le premier hit et servies depuis le cache.

+3

Vous devriez lire ceci: http://stackoverflow.com/questions/3748/storing-images-in-db-yea-or-nay – Anders

+0

Désolé, il y a quelques fautes de frappe avec ma question. Taper ça depuis mon iPhone. Éditera quand j'arriverai à un PC. –

+0

Merci anders, c'était exactement ce que je cherchais. Beaucoup de points de vue et d'opinions dans ce fil que vous avez lié. –

Répondre

4

En fait, votre magasin de données recherche avec la base de données peut être plus rapide en fonction du nombre d'images que vous avez, sauf si vous utilisez un moteur de système de fichiers hautement optimisé. Les bases de données sont conçues pour des recherches rapides et utilisent beaucoup plus de techniques intéressantes qu'un système de fichiers. Reiserfs (obsolète) vraiment génial pour les recherches, zfs, xfs et NTFS ont tous des algorithmes de hachage fantastiques, linux ext4 semble prometteur aussi.

La frappe sur le système ne sera pas différente en termes de lectures de blocs. La question est ce qui est plus rapide une recherche de requête qui renvoie le nom de fichier (peut-être un hachage?) Qui est à son tour accessible à l'aide d'une ouverture séparée, clos de fichiers? ou juste jeter le blob?

Plusieurs éléments sont à prendre en compte, notamment le succès du réseau, le succès du traitement, la distribuabilité, etc. Si vous stockez des données dans la base de données, vous pouvez les déplacer. Encore une fois, si vous stockez des images sur un service de distribution de contenu qui peut être plus rapide car vous ne faites pas de coups de réseau sur vous-même.

y pense, et rappelez-vous peu de l'analyse comparative jamais de mal à personne :-) donc le tester avec la taille de votre ensemble de données typique et prendre en compte des choses telles que les requêtes simultanées, etc.

+0

Salut Elf King. Vous faites un bon point sur l'infrastructure, j'ai mis à jour ma question. Bien que je me rende compte qu'il y a plusieurs facteurs à considérer (comme vous l'avez souligné), je cherche des opinions éclairées/éventuellement de l'expérience sur des gens qui ont essayé d'une façon ou d'une autre et comment cela a fonctionné. –

+0

Eh bien, j'ai réussi à la fois dans les environnements de production pour les grands projets. Dans un projet, le système produisait environ 10 x 10 Mo d'images chaque seconde de chaque jour, et tous devaient être triés et associés à plusieurs utilisateurs. (Utilisé une combinaison de FS et DB là-bas). Ici en raison du taux de production élevé a dû utiliser FS distribuée. Dans d'autres les images étaient grandes mais statiques, utilisé des blobs DB là. Je pense que pour votre application, vous pouvez être mieux avec juste DB. Vous devrez peut-être également prendre en compte la légalité de l'identité de l'image numérique. –

4

références de magasin aux fichiers sur un base de données et stocker les fichiers eux-mêmes sur le disque.

Cette approche est beaucoup plus flexible et plus facile à mettre à l'échelle.

Vous pouvez avoir une base de données unique et plusieurs serveurs desservant un contenu statique. Il sera beaucoup plus difficile d'avoir plusieurs bases de données en train de faire ce travail.

Flickr fonctionne de cette façon.

Espérons que ça aide.

+1

Génial. J'essayais de trouver un bon moyen de stocker l'image de profil dans mon site Web, je vais aller avec cette solution aussi –

+0

@JonKoivula J'ai une autre réponse qui s'attarde à plus de détails. Cela peut être utile. http://stackoverflow.com/questions/8922056/what-is-the-best-way-to-upload-and-store-pictures-on-the-site/8922090#8922090 – Frankie

+1

Wow merci beaucoup Frankie, vous avez vraiment m'a donné une réponse utile. Je l'apprécie beaucoup. –

Questions connexes