web-dev-qa-db-fra.com

Souhaitez-vous stocker des données binaires dans une base de données ou dans un système de fichiers?

C'est une question qui a été posée auparavant ( gros texte et images en sql ) mais principalement pour les données qui seront modifiées. Dans mon cas, les données seront stockées et ne seront jamais modifiées. Semble juste raisonnable de tout garder ensemble.

Y a-t-il des raisons pour lesquelles je ne devrais pas stocker de données binaires statiques dans une base de données?

En supposant que c'est une chose sensée à faire, y a-t-il des avantages à stocker ces données dans des tableaux séparés? (Vous pourriez commencer à réaliser maintenant que je ne suis pas un expert DB ...)

Précisez: il n'y aura probablement pas plus de 10 à 20 utilisateurs, mais ceux-ci seront aux États-Unis et au Royaume-Uni. Les données binaires devront être transférées dans tous les cas.

40
paul

L'avantage de stocker des données dans la base de données est de profiter des mécanismes de sécurité de la base de données et de réduire les coûts de maintenance (sauvegardes, ...). L'inconvénient est l'augmentation de la charge de base de données et la consommation de connexions (ce qui peut être coûteux pour les serveurs de bases de données sous licence par connexion). Si vous utilisez SQL Server 2008, FILESTREAM peut être une alternative intéressante.

Soit dit en passant, pour les applications Web (ou toute autre application qui pourrait avoir besoin de diffuser les données), il est généralement plus judicieux de stocker des données en dehors de la base de données.

33
Mehrdad Afshari

Toutes ces discussions sur la sélection "à partir de la table" provoquant d'énormes problèmes de mémoire et/ou de bande passante lorsque la table contient un LOB ne sont pas un problème. Tout ce qui est retourné est un pointeur sur le LOB en question. Pas assez de réputation pour mettre le commentaire en contexte, mais les personnes qui le consultent devraient savoir que ce n'est PAS un problème.

11
entomo

Le plus gros inconvénient si vous stockez des BLOBS est la consommation de mémoire. Pouvez-vous imaginer ce que la sélection * de x ferait pour des milliers d'enregistrements avec une image de 45k dans chacun?

Comme Mehrdad l'a dit, il y a aussi des avantages. Donc, si vous décidez de suivre cette approche, vous devez essayer de concevoir votre base de données de sorte que la plupart des requêtes renvoient moins de résultats avec des données BLOB. Peut-être par exemple établir des relations un à un à cet effet.

9
Vasil

Abordant le problème du point de vue des principes, une base de données relationnelle est (principalement) là pour stocker des données structurées. Si vous ne pouvez pas créer une condition de requête ou joindre un élément de données, il n'appartient probablement pas à la base de données. Je ne vois pas un BLOB d'image utilisé dans une clause WHERE, donc je dirais de le garder en dehors de la base de données. Un CLOB d'autre part peut être utilisé dans les requêtes.

7
Nils Weinander

Je connais un projet OSS de assez bonne taille qui a pris la décision à ses débuts de stocker des images dans la base de données MySQL, et il s'est avéré être parmi les 3 mauvaises idées auxquelles ils ont dû faire face depuis. (Exacerbé par le fait que le "refactor impitoyablement" est un anathème, mais c'est une autre histoire.)

Parmi les graves problèmes que cela a causés:

  1. Dépassement de la taille de base de données efficace maximale (mysql). (L'espace total requis pour les images dépasse tous les autres d'au moins 2 ordres de grandeur).

  2. Les fichiers image perdent leur "fileness". Aucune taille de date, etc., sauf si elles sont stockées (de manière redondante) en tant que dates (qui nécessitent un code pour la gestion).

  3. Les séquences d'octets arbitraires ne sont pas toujours bien traitées, que ce soit pour le stockage ou la manipulation.

  4. "Nous n'aurons jamais besoin d'accéder aux images en externe" est une hypothèse dangereuse.

  5. Fragilité. Parce que tout l'arrangement n'est pas naturel et délicat, et vous ne savez pas où il mordra ensuite (contribuant à la mentalité anti-refactor).

Les avantages? Aucune à laquelle je puisse penser, sauf que cela aurait pu être la voie de la moindre résistance à l'époque.

6
dkretz

Je pense que cela dépend de l'application de votre bâtiment. Si vous créez un système CMS et que les données seront utilisées pour afficher des images dans un navigateur Web, il peut être judicieux d'enregistrer les images sur le disque plutôt que de les placer dans la base de données. Bien honnêtement, je ferais les deux, ce qui pourrait permettre d'ajouter un serveur à une ferme sans avoir à copier des fichiers partout.

Un autre cas d'utilisation peut être un objet complexe, tel qu'un flux de travail, ou même un objet métier avec beaucoup d'interdépendances. Vous pouvez sérialiser les deux en format binaire ou texte et les enregistrer dans la base de données. Ensuite, vous bénéficiez de la base de données: ATOMIC, Backups, etc ...

Je ne pense pas que les gens devraient utiliser select * interroge en premier lieu. Ce que vous faites est de fournir deux façons d'obtenir les données, une méthode renvoie les informations récapitulatives, la seconde renvoie le blob. Je ne peux pas imaginer pourquoi vous auriez besoin de renvoyer des milliers d'images à la fois.

5
JoshBerke

Celui qui a eu l'idée de stocker une image (ou un autre document binaire) dans une base de données n'est pas quelqu'un dont je suis très content. Les bases de données sont destinées au stockage de données [principalement?] INDEXABLES ET DISCRETES. Pas des BLOB de données binaires sans signification. Si vous avez déjà travaillé avec des BLOB pour les données binaires, vous le savez déjà.

Vous devez stocker une référence au fichier dans le système de fichiers. La meilleure pratique est un nom de fichier, pas un chemin absolu (ou même relatif).

4
Ryan Williams

Nous stockons les pièces jointes dans notre système, et vous ne pouvez pas modifier une pièce jointe, donc je pense que nous sommes sur la même page avec des données qui "seront stockées et ne seront jamais modifiées". Nous avons spécifiquement décidé pas de le stocker dans la base de données. Nous l'avons fait pour deux raisons, la simplicité et le temps de sauvegarde/restauration.

La simplicité d'abord: dans notre cas, ces pièces jointes sont téléchargées à partir du navigateur de l'utilisateur final, et il est plus simple de simplement les écrire dans un répertoire (sur le serveur de base de données) que de les diffuser ensuite sur le canal SQL. Il y a un enregistrement d'eux dans la base de données, mais la base de données contient juste des méta-informations sur la pièce jointe et le nom du fichier sur le disque (un guide dans notre cas)

Du côté de la sauvegarde/récupération: ces blobs deviendront probablement l'un des plus gros éléments de votre base de données. Chaque fois que vous exécutez une sauvegarde complète, vous copiez ces bits encore et encore, même si vous savez que cela ne pourra jamais changer. Pour nous, il semblait beaucoup plus simple d'avoir des sauvegardes (beaucoup) plus petites et de faire une copie du répertoire des pièces jointes sur un serveur secondaire comme sauvegarde.

2
Walden Leverich

N'est-ce pas exactement ce que les LOB ou CLOB ou .... ont été conçus?

Nous avons utilisé des CLOB pour stocker les cryptages importants des transactions par carte de crédit pour un grand réseau de compagnies aériennes.

La consommation de mémoire est cependant votre plus grand coupable.

HTH

à votre santé,

1
Rob Wells

Certaines bases de données (par exemple Postgresql) compressent automatiquement les champs, c'est peut-être plus rapide lorsque vous les lisez directement à partir de db. Et aussi, le programme peut lire tous les champs et l'image en un seul coup.

1
Michael Buen

Le problème de performance ici a été abordé ci-dessus, donc je ne le répéterai pas. Mais je pense qu'une bonne astuce si vous stockez des choses qui seront beaucoup diffusées (comme des images/documents sur un site Web) est de construire dans un système de mise en cache.

J'entends par là stocker toutes les données dans votre base de données, mais lorsque quelqu'un demande ce fichier, vérifiez s'il existe sur le disque (basé sur un nom de fichier connu, dans un dossier temporaire), sinon, récupérez-le de la base de données et écrivez-le dans le dossier, puis le diffuser à l'utilisateur. Pour la prochaine requête vers le même fichier, car il existe sur le disque, il peut être servi à partir de là sans toucher la base de données. Mais si vous devez supprimer ces fichiers (ou votre serveur Web passe en kapput!), Cela n'a pas d'importance car ils seront à nouveau reconstruits à partir de la base de données lorsque les gens le demanderont. Cela devrait être beaucoup plus rapide que de servir chaque demande pour le même fichier à partir de la base de données.

1
JonoW