Quel est le meilleur endroit pour stocker des fichiers binaires liés aux données de votre base de données? Devrais-tu:
- Stocker dans la base de données avec un blob
- Stocker sur le système de fichiers avec un lien dans la base de données
- Stocker dans le système de fichiers mais renommer un hachage du contenu et stocker le hachage sur la base de données
- 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
la source
Réponses:
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é.
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:
C:\
tout le chemin à la.doc
et non toutes les versions de NT ont pu traiter de longs chemins.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é.
la source
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)
la source
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.
la source
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.
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.
la source
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:
Encore mieux, dites-le à voix haute.
Sur les faits:
Utiliser la base de données
" PROS " ... mais pas tout à fait :
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:
Utiliser le système de fichiers
AVANTAGES:
CONS :
*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.
En réalité, logiquement, l’application devrait être en charge de la gestion et du service des liens.
Une solution:
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.
la source
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.
la source
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.
la source
SELECT image FROM table
SSMS vérifie que la bonne image existe?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 (asyncio
ouepoll
), il n'y a passendfile
(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_repair
est 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
s3fs
cela peut être transparent).Exceptions
Le stockage de fichiers dans la base de données a quelques cas d'utilisation valides,
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:
PostgreSQL via l’infrastructure de gros objets fournit un descripteur de fichier à une ressource pour la durée de la transaction.
L'infrastructure filestream de SQL Server 2017 fournit un accès temporaire qui dure toute la durée de la transaction, que vous pouvez utiliser pour obtenir le chemin du fichier et ouvrir un descripteur de fichier.
Oracle fournit
BFILE
(cela n’a rien à voir avec leur contenu LOB interne appeléSecureFile
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.
la source
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).
la source
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.
la source
Pour postgres:
C'est en fait tout à fait en avance. Il existe un
BYTEA
type 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 logicielByteStream
similaire, 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 unlo
type 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.la source
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.
la source