2010-03-15 9 views
2

Quels sont les avantages et les inconvénients de stocker une image en tant que blob dans la base de données par rapport au stockage du nom de fichier dans la base de données. J'utilise PHP (CodeIgniter) avec MySQL.Meilleure approche pour stocker l'image téléchargée

Je sais que cette question est subjective mais un client m'a posé cette question et je ne pouvais pas donner une bonne réponse.

Répondre

14

je dirais généralement que:

    base de données
  • est plus difficile à l'échelle:
    • ayant un DB qui a une taille de plusieurs Go d'images, car beaucoup de choses fera (sauvegarde, par exemple) plus difficile.
    • voulez-vous mettre plus de charge sur vos serveurs DB, pour servir ... des fichiers?
  • images au service du système de fichiers est quelque chose que les serveurs Web font bien
    • et il permet de faire certaines tâches (comme les vignettes de production, par exemple) sans impliquer le serveur DB
    • je suppose , le cas échéant, que l'utilisation de fichiers anciens simples aussi rendre les choses plus faciles le jour où vous voulez utiliser une sorte de CDN

Ce qui signifie que je stockerais presque toujours des images/fichiers dans le système de fichiers, et seulement stocker le nom du fichier (et, éventuellement, taille et type de contenu - qui peut toujours être utile) dans la base de données. En pensant à cela, cette question est probablement une copie ... Oh, oui, c'est effectivement; voir au moins ces questions + réponses:

+0

Pascal MARTIN, Votre réponse semble assez convaincant. Cependant, je dois dire que, après avoir essayé les deux méthodes, je n'ai pas vraiment vu une grande différence dans les performances (à savoir, stocker des images en externe, par opposition à les conserver sur une BD en tant que BLOBS). Peut-être que mon volume de données n'était pas beaucoup. Une autre préoccupation est, suggérez-vous que la lecture de plusieurs images BLOB à partir d'une base de données est plus lente que la lecture de plusieurs fichiers à partir du système de fichiers? Honnêtement, je ne peux pas accepter cela, mais le seul problème que je vois est que les sauvegardes peuvent être plus petites si les fichiers étaient conservés à l'extérieur. – itsols

1

je doute votre client ont assez d'expérience pour juger une réponse.
Une fois, le client m'a demandé de stocker l'image strictement dans la base de données. Après quelques recherches, j'ai découvert qu'ils voulaient simplement "stocker des images côté serveur", parce qu'ils avaient déjà une base de données MS Access et qu'ils avaient le choix entre stocker des images dans la base de données ou simplement des liens vers les images, tandis que l'image elle-même resté sur le disque dur des utilisateurs et souvent indisponible. En ce qui concerne votre question, je doute que l'image ait une relation avec le modèle relationnel. Vous ne pouvez pas trier, filtrer, associer avec d'autres lignes en fonction du contenu blob. Alors que vous devez faire beaucoup de choses pour soutenir les images dans la base de données - script dédié à montrer, émuler obtenir conditionnel, etc Je sais, cette fonctionnalité existe.Mais il s'agit plus d'une tentative évidente de suivre la mode que d'un réel besoin, notamment dans le développement web, où les images demandées avec séparent les requêtes.

0

Je préfère renommer les fichiers images lors téléchargés et de les stocker en ligne db liée à son propre parent (utilisateur, produit,) ... puis les télécharger dans 3 dossiers:

/uploads 
    /img 
    /products 
    /small 
    /medium 
    /xxl 

les redimensionner en petits (50x50), moyen (90x90), xxl (dimension originale), avant de les déplacer dans ces répertoires.

si vous avez besoin d'images SEO vous pouvez les stocker par exemple:

id | product | image 
1 book  1-book.png 

et vous obtiendrez id et le nom du produit dans le même fichier image.

ou vous pouvez même simplement stocker

id | product | image 
1 book  1.png 

est alors simple de joindre des chemins src:

/*Config file*/ 
$config['base_static_products_url'] = 'uploads/img/products/'; 

/*View file*/ 

<img src="<?php echo base_url().$this->config->config['base_static_products_url'].'/small/'.$row->image ?>" alt=""/> 

OR (no SEO) 

<img src="<?php echo base_url().$this->config->config['base_static_products_url'].'/small/'.$row->id.'.png' ?>" alt=""/> 
+0

regardez, cela dépend aussi si vous avez besoin de stocker tous les fichiers dans le même fichier, si vous savez que vous utiliserez uniquement des fichiers png ou simplement des fichiers jpg, vous pouvez également stocker n'importe quel fichier dans db et renommer les fichiers avec row_id. png – sbaaaang

Questions connexes