Les fichiers binaires doivent-ils être stockés dans la base de données?


123

Quel est le meilleur endroit pour stocker des fichiers binaires liés aux données de votre base de données? Devrais-tu:

  1. Stocker dans la base de données avec un blob
  2. Stocker sur le système de fichiers avec un lien dans la base de données
  3. Stocker dans le système de fichiers mais renommer un hachage du contenu et stocker le hachage sur la base de données
  4. Quelque chose que je n'ai pas pensé

Les avantages de (1) sont (entre autres) que l’atomicité des transactions est préservée. Le coût est que vous pourriez augmenter considérablement les besoins en stockage (et la diffusion / sauvegarde associée)

Le but de (3) est de préserver l'atomicité dans une certaine mesure - si vous pouvez imposer que le système de fichiers que vous écrivez ne permet pas la modification ou la suppression de fichiers, et a toujours le hachage correct comme nom de fichier. L’idée serait d’écrire le fichier sur le système de fichiers avant de permettre l’insertion / la mise à jour référençant le hachage - si cette transaction échoue après l’écriture du système de fichiers mais avant la base de données DML, c’est bien parce que le système de fichiers est en train de «simuler» le référentiel de tous. fichiers et hachages possibles - peu importe si certains fichiers ne sont pas référencés (vous pouvez les nettoyer périodiquement si vous êtes prudent)

MODIFIER:

Il semble que certains SGBDT traitent cela de manière individuelle - je serais intéressé de savoir comment les autres le font - et en particulier une solution pour postgres


8
Cette question a une copie ici: Est-il préférable de stocker des images dans un blob ou simplement dans l'URL? cela a été fermé en faveur de celui-ci, comme celui-ci étant plus remarquable. S'il vous plaît assurez-vous de lire les deux questions pour plus de perspicacité!
Marian le

Réponses:


57
  1. Stocker dans la base de données avec un blob

    Un inconvénient est que vos fichiers de base de données sont volumineux et éventuellement trop volumineux pour pouvoir être sauvegardés avec votre configuration existante. Un avantage est l'intégrité et l'atomicité.

  2. Stocker sur le système de fichiers avec un lien dans la base de données

    J'ai rencontré de telles catastrophes horribles et cela me fait peur que les gens ne cessent de le suggérer. Certains des désastres inclus:

    • Un utilisateur privilégié qui réorganiserait les fichiers et romprait fréquemment les liens entre les chemins de la base de données et leur emplacement actuel (mais cela est devenu ma faute).
    • Lors du transfert d’un serveur à un autre, la propriété de certains fichiers a été perdue car le SID du compte administrateur de l’ancien ordinateur (sur lequel l’ancien site Web était exécuté) ne faisait pas partie du domaine et les fichiers copiés avaient donc des ACL pouvant ne pas être résolu, présentant ainsi aux utilisateurs l'invite de connexion nom d'utilisateur / mot de passe / domaine.
    • Certains des chemins a fini par être plus de 256 caractères du C:\tout le chemin à la .docet non toutes les versions de NT ont pu traiter de longs chemins.
  3. Stocker dans le système de fichiers mais renommer un hachage du contenu et stocker le hachage sur la base de données

    Le dernier endroit où j'ai travaillé a fait cela en me basant sur mon explication des scénarios ci-dessus. Ils pensaient qu'il s'agissait d'un compromis entre l'incapacité de l'entreprise à acquérir de l'expérience dans l'utilisation de bases de données volumineuses (toute taille supérieure à environ 40 Go était censée être "trop ​​grande"), l'incapacité de l'entreprise à acheter des disques durs de grande taille et l'incapacité d'acheter un disque plus moderne. solution, et la nécessité de s’éloigner des risques n ° 1 et n ° 3 que j’ai identifiés ci-dessus.

Mon opinion est que le stockage dans la base de données en tant que blob est une meilleure solution et plus évolutive dans un scénario multiserveur, en particulier en cas de basculement et de problèmes de disponibilité.


2
Je ne suis pas sûr que la taille de la sauvegarde pose problème. les données doivent être sauvegardées quel que soit le type de stockage. La même décision différentielle par rapport à la décision complète est prise, qu'il s'agisse d'un FS ou d'un DB. Je note que ceci est présenté comme un argument possible, pas votre point de vue.
Phil Lello

2
Une fois, j’ai eu un problème où des centaines de mégaoctets étaient écrits dans chaque rangée des milliers de fois par jour. Ils stockaient un fichier GZIP dans la base de données en tant que fichier binaire pour 10 000 serveurs, mais un bogue a été introduit: chaque serveur enregistrait des informations pour chaque serveur, par alerte. C'était horrible. Après cet incident, je suis devenu catégorique sur les types de données «no (MAX)», à moins que cela ne soit extrêmement justifié.
Ali Razeghi

7
L'ensemble "rupture de lien" est un problème d'application et non un problème de base de données. La base de données fait son travail (servir des données pures) alors que l'application ne le fait pas (servir des types de fichiers mixtes). L'application doit avoir la responsabilité de servir les fichiers. En stockant un chemin de routage abstrait dans la base de données qui fonctionnerait quel que soit l'endroit où le fichier est stocké sur le serveur en interne (ala routage Symfony2). Cela détournerait les chemins natifs, rendrait l'application plus portable, maintenable et permettrait de passer à tout type de système de fichiers sans rien casser.
Tek

29

Numéro 1 pour l'intégrité complète des données. Utilisez les autres options si vous ne vous souciez pas de la qualité des données. C'est si simple.

La plupart des SGBDR ont des optimisations pour le stockage des BLOB (par exemple, flux de fichiers SQL Server)


De quoi s'agit-il (3) spécifiquement qui met en péril l'intégrité des données? (en supposant que votre API transactionnelle soit correcte)
Jack Douglas

4
@JackPDouglas: vous avez un hash qui n'est pas la bonne donnée mais qui a toujours une dépendance externe pour l'intégrité des dats
gbn le

6
@JackPDouglas Il est également possible que l'administrateur du serveur et l'administrateur de la base de données forment des équipes différentes, avec le risque associé que des fichiers soient supprimés par erreur ou non sauvegardés, au sens de fichiers temporaires.
Phil Lello

21

Si vous optez pour Oracle, jetez un coup d'œil à dbfs et Secure Files.

Secure Files dit tout, gardez TOUTES vos données en sécurité dans la base de données. Il est organisé en lobs. Secure Files est une version modernisée de lobs, qui devrait être activée.

dbfs est un système de fichiers dans la base de données. Vous pouvez le monter de la même manière qu’un système de fichiers réseau, sur un hôte Linux. C'est vraiment puissant. Voir le blog Il a également beaucoup d'options pour répondre à vos besoins spécifiques. En tant que dba, étant donné un système de fichiers (basé sur la base de données, monté sur Linux), j'ai créé une base de données Oracle dessus sans aucun problème. (une base de données, stockée dans une ... base de données). Cela ne serait pas très utile, mais cela montre le pouvoir.

Les autres avantages sont les suivants: disponibilité, sauvegarde, récupération, toutes les lectures cohérentes avec les autres données relationnelles.

Parfois, la taille est donnée comme raison de ne pas stocker de documents dans la base de données. Ces données doivent probablement être sauvegardées de toutes les manières, ce n'est donc pas une bonne raison de ne pas les stocker dans la base de données. Particulièrement dans une situation où les anciens documents doivent être considérés en lecture seule, il est facile de faire en sorte que de grandes parties de la base de données soient en lecture seule. Dans ce cas, ces parties de la base de données n'ont plus besoin d'une sauvegarde fréquente.

Une référence dans une table à quelque chose en dehors de la base de données est dangereuse. Il peut être manipulé, difficile à vérifier et peut facilement se perdre. Qu'en est-il des transactions? La base de données offre des solutions à tous ces problèmes. Avec Oracle DBFS, vous pouvez donner vos documents à des applications autres que des bases de données. Ils ne sauraient même pas qu’ils piquent dans une base de données.

Une dernière grande surprise: les performances d’un système de fichiers dbfs sont souvent meilleures que celles d’un système de fichiers classique. Cela est particulièrement vrai si les fichiers ont une taille supérieure à quelques blocs.


15

Je pense que la bonne réponse ici dépend beaucoup de votre demande et de l’importance de ces documents.

Pour un système de gestion de documents, ou un système dans lequel la récupérabilité des documents stockés est essentielle (pour la plupart des aspects financiers, liés aux ressources humaines ou à la gestion de la relation client), le stockage de documents en ligne ou l'utilisation de la technologie de gestion des documents propriétaires de votre fournisseur de DB préféré semble être la bonne chose à faire.

Cependant, il existe de nombreuses applications pour lesquelles je pense que la décision opposée est appropriée.

Les systèmes d’assistance technique et les systèmes de type wiki sont des systèmes pour lesquels il est judicieux de conserver les données hors de la base de données. Je pense que certains, comme Jira, offrent en fait une option permettant de choisir si vous souhaitez stocker des documents en ligne ou non.

Pour une entreprise de taille moyenne, le stockage en ligne de documents pour un système de tickets peut faire la différence entre une sauvegarde compressée mesurée en mégaoctets et une sauvegarde mesurée en gigaoctets.

Personnellement, je préférerais remettre un système de billetterie en ligne dans quelques minutes et me débattre avec les documents (généralement moins importants) pendant quelques heures, plutôt que d’augmenter mon "Casse et le CTO respire dans mon cou" RTO et relire les journaux à partir d'une sauvegarde beaucoup plus grande.

Il y a d'autres avantages à garder les documents séparés.

  • Vous pouvez facilement exécuter des processus distincts qui cataloguent les métadonnées de document, effectuer une analyse antivirus, indexer des mots clés, etc.
  • Vous pouvez tirer parti des outils d'aide à la sauvegarde ou à la récupération - rsync, instantanés de stockage, etc. - qui se prêtent bien mieux aux fichiers qu'aux bases de données.
  • Vous pouvez réellement utiliser un stockage prenant en charge la compression ou la déduplication (ce que vos administrateurs de SAN clament depuis des années, c'est-à-dire le fléau des administrateurs de bases de données dans le monde entier).
  • Pour une installation sur plusieurs sites, vous pouvez compléter une base de données centralisée avec un système de fichiers distribué.

Je pense qu'une combinaison hybride des n ° 2 et n ° 3 pourrait être intelligente. Conservez les noms de fichier d'origine, mais calculez et stockez une somme de contrôle du document afin de disposer d'un point de référence qui facilitera la récupération en cas de déplacement ou de renommage du fichier.

Le stockage des fichiers avec leurs noms de fichiers d'origine signifie que les applications peuvent les extraire directement d'un système de fichiers et les envoyer par fil ou dans un monde client lourd, voire même diriger l'utilisateur directement vers le serveur de fichiers.


11

Ne le fais pas.

Il n’ya vraiment aucun avantage à avoir des fichiers stockés dans la base de données.

Ne vous sentez-vous pas déjà bizarre et louche quand vous vous dites:

Devrais-je stocker des fichiers dans une base de données ou un système de fichiers ?

Encore mieux, dites-le à voix haute.

Sur les faits:

Utiliser la base de données

" PROS " ... mais pas tout à fait :

  • "Atomicity" qui est correct mais c'est une épée à double tranchant. Parce qu'il traîne par contre avec.
  • Intégrité. Comme ci-dessus.

Je ne veux vraiment pas être partial, mais je ne pense pas qu'il y ait plus à ajouter. Les avantages ne sont pas vraiment bons si vous y réfléchissez.

Si j'ai oublié quelque chose ci-dessous, en attendant, continuez à lire ci-dessous.

LES INCONVÉNIENTS:

  • Mauvais outil pour le travail
  • Plus difficile à maintenir
  • Lent
  • Oubliez le stockage de centaines de Mo / giga-octets de données par utilisateur .
  • Sauvegarder des sites en croissance rapide sera un cauchemar.
  • Restaurer / bouger sera aussi nul.

Utiliser le système de fichiers

AVANTAGES:

  • Manière plus facile à entretenir
  • Vite
  • Les sauvegardes de base de données n'ont rien à voir avec cela
  • Sans doute plus de portabilité *

CONS :

  • Aucun*

*Petits caractères

En ce moment, vous vous demandez, attendez-vous à dire qu'il n'y a pas de problème?! Comment venir?

La plus grande erreur ici est que les gens essaient de visser une vis avec un marteau.

La raison principale et j'irais même jusqu'à dire que c'est uniquement à cause des liens de fichiers .

C'est un problème que la base de données n'est pas censée résoudre. Cela semble même stupide si vous y réfléchissez.

"La base de données corrigera mes problèmes de liaison de fichiers."

En réalité, logiquement, l’application devrait être en charge de la gestion et du service des liens.

Une solution:

  1. Demandez à votre application de gérer les demandes d’URL avec des itinéraires personnalisés.
  2. Enregistrez cette route dans votre base de données.
  3. En interne, chaque fois que cet itinéraire est appelé, mappez-le sur le fichier souhaité.
  4. Si vous déplacez vos fichiers ailleurs, changez simplement la valeur du nom de fichier de la route et cette route servira toujours le même fichier, peu importe où il est stocké ou référencé sur le Web.

Cela permettrait également d’abstraire les chemins natifs, de rendre l’application plus portable, facile à gérer et de basculer vers tout type de système de fichiers sans rien casser.

La façon de la mettre en œuvre dépasse le cadre de cette réponse, mais vous pouvez regarder un exemple général dans le langage Web le plus utilisé (PHP):

https://github.com/symfony/Routing

https://github.com/kriswallsmith/assetic

Les deux ensemble sont vraiment puissants.


1
Vous pourriez être intéressé par ceci: research.microsoft.com/apps/pubs/default.aspx?id=64525 une recherche par Microsoft qui montre que le stockage de blobs dans la base de données est plus rapide que dans le système de fichiers (pour certaines tailles de blobs au moins). Ceci est conforme à mes tests qui ont montré que pour les blobs de taille moyenne (<~ 1 Mo), par exemple, Postgres est également plus rapide qu'un système de fichiers. Pour Oracle, les performances sont à peu près les mêmes mais je n'ai pas encore testé le nouveau format de stockage securefile (mais ils prétendent que c'est plus rapide que l'ancien format de stockage)
a_horse_with_no_name

J'ai vu cela, c'est pourquoi j'ai parlé de gros fichiers. De plus, OP n’ayant pas spécifié de fournisseur de base de données, les performances peuvent différer d’un fournisseur à l’autre; mon conseil est donc plus général.
Tek

9

Je veux ajouter mon expérience ici en ce qui concerne les compromis. Dans PostgreSQL, au moins, les conséquences sur les performances sont assez minimes pour le serveur de base de données. Les grands blobs sont stockés dans des fichiers distincts, et non dans les tables de segment de mémoire principales, de manière à les écarter des opérations pouvant compter un grand nombre d'enregistrements. D'autres dbs peuvent faire quelque chose de similaire.

Le principal avantage est la possibilité de conserver toutes les données liées au même endroit à des fins de sauvegarde et de sauvegarde. Cela réduit considérablement le risque d'erreur.

L’inconvénient majeur n’est pas celui que j’ai vu plus haut, c’est l’utilisation de la mémoire en mode frontal. Je ne sais pas exactement comment chaque base de données gère cela, donc cela dépend de l'implémentation, mais pour PostgreSQL, les données sont stockées sous forme de chaîne ASCII d'échappement (éventuellement hexadécimale, éventuellement avec des échappements en ligne). Cela doit ensuite être reconverti en binaire dans le front-end. De nombreux frameworks que j'ai vus à cette fin impliquent de passer la valeur (pas en tant que référence), puis de construire une nouvelle chaîne binaire basée sur celle-ci. J'ai calculé qu'utiliser Perl pour faire cela finissait par utiliser plusieurs fois la mémoire du binaire d'origine à accomplir.

Verdict: Si les fichiers ne sont que rarement utilisés, je les enregistrerais dans la base de données. S'ils font l'objet d'un accès fréquent et répété, du moins avec PostgreSQL, je pense que les coûts sont supérieurs aux avantages.


7

De retour dans la journée, Microsoft avait décidé de stocker des images (et des types de données blob similaires) dans la base de données. C’était une nouvelle fonctionnalité intéressante de SQL Server 2000 (je suis à peu près sûr que c’était la version 2000, et non la 7.0) et beaucoup de personnes ont pris le train en marche.

Stocker des BLOBs dans la base de données présente des avantages et des inconvénients:

D'une part, toutes vos données et images ou documents associés peuvent être stockés et accessibles en un seul endroit. Les utilisateurs de l'application ne nécessitent pas d'autorisations réseau spéciales, car c'est le SQL qui fournit les images / fichiers / documents.

D'autre part, votre base de données peut devenir assez volumineuse, en fonction de la taille et du nombre de BLOB que vous stockez. Cela concerne les sauvegardes, les exigences de stockage, les opérations de récupération sensibles au temps, etc.

SQL Server 2008 a introduit le streaming de fichiers. La base de données contient des pointeurs sur les fichiers. Les fichiers résident sur le serveur, pas dans la base de données, mais lorsque vous sauvegardez la base de données, les fichiers sont également sauvegardés.

Vos sauvegardes peuvent devenir assez volumineuses, mais vous ne vous retrouvez pas avec des fichiers / documents / blobs / images orphelins.

Ma préférence personnelle a été de laisser la base de données stocker les pointeurs / les emplacements réseau et de laisser un serveur de fichiers gérer les fichiers. Les serveurs de fichiers sont de toute façon mieux optimisés pour de telles tâches.


5
Peu importe, si vous ne possédez pas le serveur, vous allez payer beaucoup plus cher par Mo d'espace disque pour la base de données. En outre, le fait de disposer du fichier sur le disque facilite le dépannage. Comment faire pour que SELECT image FROM tableSSMS vérifie que la bonne image existe?
Aaron Bertrand

7

Ne stockez pas de fichiers dans une base de données.

Tout le monde, sans exception, pouvant exécuter n’importe quel SGBDR sur le marché possède déjà une base de données spécifique pour le stockage de fichiers, et le SGBDR l’utilise lui-même! Cette base de données est le système de fichiers . Parlons maintenant de certains des inconvénients potentiels du stockage de fichiers dans la base de données, ainsi que de certains facteurs atténuants spécifiques pour le stockage de fichiers dans la base de données.

  • Pas de filehandes aux fichiers dans la base de données. Qu'est-ce que ça veut dire?

    • Programmeur-talk: Vous NE POUVEZ PAS chercher ( fseek), il n'y a aucune possibilité de gérer la ressource avec un accès asynchrone ( asyncioou epoll), il n'y a pas sendfile(vous enregistrez la copie de l'espace du noyau).

    • Application pratique: vous souhaitez envoyer une vidéo ou une image à un client via HTTP2 / 3? Si c'est dans la base de données, vous devrez d'abord l'interroger. Quelle que soit la requête qui renvoie ce fichier, vous devez attendre que la requête entière se termine avant que ce fichier ne puisse passer à l'étape suivante. Dans une installation de production avec un rdbms sur un serveur différent de celui du serveur Web, vous devez d’ abord transférer le fichier entièrement du rdbms au serveur Web plutôt que de le diffuser en continu. Toutefois, si la couche de transport fournit une abstraction du système de fichiers (prise en charge même par NFS), vous pouvez effectuer une recherche à mi-chemin du fichier et commencer immédiatement à le retransmettre au client sans mettre en mémoire tampon la quantité de fichier nécessaire. Ceci est fait systématiquement par le serveur webnginx , Apache , PureFTP et ProFTP.

  • Double copie sur le SGBDR. Du fait qu'il se trouve dans la base de données, vous l'écrirez probablement deux fois. Une fois dans un journal à écriture anticipée (WAL), puis à nouveau dans le tablespace.

  • Aucune mise à jour, jamais MVCC signifie que rien n'est mis à jour, seulement copié à nouveau avec les modifications, puis l'ancienne ligne est marquée comme expirée (supprimée). Toute mise à jour du fichier nécessitera l'écriture de la ligne entière , pas uniquement celle du fichier. Les systèmes de fichiers peuvent également fournir cela, avec la journalisation des données, mais vous en avez rarement besoin.

  • Lecture de fichier et transfert pour ralentir la requête Si le fichier lui-même est stocké sur une ligne que vous devez interroger, la ligne entière devra attendre que le fichier soit transféré ou vous devrez émettre deux requêtes distinctes. .

  • Utilisation de la mémoire sur le client de base de données. Le client de base de données (libpq, jdbc, odbc, freetds, etc.) ou similaire va probablement mettre la requête en mémoire tampon. Lorsque cette mémoire tampon en mémoire est épuisée, elle peut démarrer une mémoire tampon de disque ou, pire encore, revenir au noyau pour être paginée sur le disque.

  • La limitation des requêtes dans de nombreuses bases de données offre la possibilité de supprimer et de récupérer des requêtes lorsqu'elles prennent trop de temps ou de ressources. Gardez à l'esprit que les transferts de fichiers ne seront en aucun cas détaillés. Cette requête a-t-elle été tuée après 3 secondes? Ou cela a-t-il pris 1 seconde et le serveur a passé 2 secondes à transférer un fichier? Pas seulement "en détail", comment allez-vous indiquer de manière efficace combien de temps une requête devrait prendre lorsque 99,9% des requêtes renvoient 1 ko et l'autre renvoyant 1 Go?

  • Pas de copie sur écriture ou de déduplication XFS et BTRFS prennent en charge la copie sur écriture et la déduplication de manière transparente. Cela signifie que le système de fichiers gère de manière transparente la même image partout ou nécessite une seconde copie . Cependant, si le fichier n'est pas autonome et qu'il se trouve sur une ligne ou dans un magasin, le système de fichiers est probablement incapable de le dédupliquer.

  • Intégrité, beaucoup de gens ici parlent d'intégrité. Selon vous, quoi de mieux pour détecter la corruption du système de fichiers, une application qui utilise le système de fichiers ou les principaux utilitaires du système de fichiers? Stocker un fichier dans une ligne ou hors ligne et toute corruption du système de fichiers sera masquée pour la base de données. xfs_repairest sacrément bon pour récupérer lorsque vous avez une corruption de système de fichiers ou de disque dur, et si elle échoue, il sera toujours beaucoup plus facile de faire de l'informatique judiciaire.

  • Migration dans le cloud Si vous souhaitez stocker les fichiers sur un réseau de stockage ou dans le cloud, vous aurez d'autant plus de difficulté que la migration de stockage est désormais une migration de base de données. Si vos fichiers sont par exemple stockés sur le système de fichiers, vous pouvez les déplacer assez facilement vers S3 (et avec quelque chose comme s3fscela peut être transparent).

Exceptions

Le stockage de fichiers dans la base de données a quelques cas d'utilisation valides,

  • Lorsque vous devez modifier le fichier de manière transitoire. Cela signifie que la modification du fichier fait littéralement partie de votre transaction. Ou vous avez besoin de la possibilité de restaurer les modifications apportées au fichier si la transaction échoue pour des problèmes d'intégrité des données dans les relations (tables).
  • Lorsque vous devez vous assurer que le système de fichiers contient une version précise des données et que vous ne pouvez supporter aucun risque si vous les synchronisez.
  • Lorsque la base de données peut réellement analyser le fichier et vous pouvez l'interroger. Dans PostgreSQL, par exemple, les topologies peuvent être des requêtes avec PostGIS. À ce stade, bien qu'il s'agisse d'un fichier, il s'agit également de données pour la requête et non d'un cliché de stockage.

Les mitigations

  • Certaines bases de données ont la notion de "ressource gérée en externe": la base de données gère le fichier de manière privée sur le disque, par exemple:

  • Certaines bases de données stockent des objets binaires volumineux hors ligne ou peuvent, comme Oracle SecureFile. Cela vous permet de mettre à jour la ligne sans réécrire le fichier.

  • Certaines bases de données telles qu'Oracle font leur MVC sans journal WAL et n'ont pas besoin de doubler l'écriture du fichier.

  • Certaines bases de données, telles que SQL Server et Oracle, offrent la possibilité de "diffuser" les données du fichier sans jamais y avoir de descripteur de fichier. Cela peut ou non s’exécuter sur une connexion différente de celle de la requête databaes. Mais la clé ici est que, même si vous pouvez diffuser le fichier en continu (en théorie), je ne trouve aucune preuve de produit non fabriqué par le fournisseur qui utilise cette fonctionnalité. Par exemple, où se trouve le pont NGINX / Apache pour vous permettre de le faire?

  • Oracle propose des options de déduplication, de compression et de chiffrement via un stockage LOB interne (tel que SecureFile).

Conclusion

Le pire scénario lorsque vous insérez un fichier dans la base de données est très mauvais pour la performance et la compatibilité avec les outils. Cela dépend toujours exceptionnellement de la mise en œuvre. En aucun cas, la base de données n'est meilleure à être un système de fichiers que le système de fichiers. Dans tous les cas, c'est un compromis et même lorsque vous disposez de puissantes fonctionnalités d'atténuation (comme dans le cas de SecureFile), l'outillage est si médiocre qu'il ne s'agit en réalité que d'un simple argument marketing, à moins que votre pile ne soit entièrement construite par le fournisseur de SGBDR.

Restez simple, et la règle générale est de conserver les fichiers hors de la base de données .

Solution

Comment devriez-vous stocker des fichiers ou résumer un système de fichiers de manière à fonctionner efficacement pour plusieurs locataires et utilisateurs? Je suis enclin à hacher le contenu du fichier. C'est assez commun ces jours-ci et fonctionne bien.


6

Bien que cela dépende en partie de l'application / de l'environnement (personnes incluses), je choisirais le blob.

Tout garder dans la base de données signifie que la réplication fonctionne pour les données de fichier. Vous auriez besoin d'un mécanisme distinct pour synchroniser les fichiers FS.

Dans certaines applications, le système de fichiers ne doit de toute façon pas être modifié. Par exemple, sur un site Web de production, j’éviterais d’utiliser jamais le système de fichiers pour des données non disponibles (le site vit sous un SCM, les données d’une base de données).

En supposant que nous ayons plusieurs utilisateurs / applications avec des autorisations distinctes, alors tout stockage de système de fichiers offre une possibilité de différences dans les droits d'accès à la base de données et au service stock.

Le raffinement que je souhaiterais apporter au stockage BLOB est de fragmenter les données si cela a du sens. si vous n'avez besoin que de 512 octets d'un BLOB de 20 Mo, cet accès sectoriel est un réel avantage, en particulier si vous traitez avec des clients distants (et encore une mise à jour partielle crée beaucoup moins de trafic de réplication).


6

Mon vote serait pour ni l'un ni l'autre. Stockez les données dans un système tel que le CDN d'Amazon S3 ou Microsft et stockez cette URL dans la base de données.

De cette façon, vous avez la garantie d'avoir les données toujours accessibles sans avoir à gérer des bases de données de la taille d'un monstre.


3

Pour postgres:

C'est en fait tout à fait en avance. Il existe un BYTEAtype qui peut être utilisé pour stocker des chaînes binaires. Par défaut, il n’existe aucune utilisation de construction telle que celles mentionnées pour MS ou Oracle. Donc, stocker beaucoup de gros fichiers et les récupérer peut devenir fastidieux. Vous devez également effectuer la conversion des fichiers au sein de l’application (comme avec un logiciel ByteStreamsimilaire, aucune idée de la manière dont cela fonctionne avec les solutions de base de données MS / Oracle spécifiques <-> de la base de données). Il existe également un lotype qui facilite le travail de gestion des objets BLOB, car une partie de la gestion interne de ces types peut ne pas suivre les références.


-4

Partagez mon expérience de Ms SQL Server et un grand nombre de fichiers. Nous sauvegardons les fichiers sur un serveur de fichiers. La base de données a deux tables, une pour les dossiers de fichiers et les informations d’accès, une pour le nom de fichier. Il est facile de maintenir la base de données et les fichiers. Vous pouvez facilement déplacer les fichiers même sur les serveurs, il suffit de modifier la table des dossiers.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.