web-dev-qa-db-fra.com

Quelle est la meilleure façon de stocker des fichiers multimédias sur une base de données?

Je veux stocker un grand nombre de fichiers audio dans une base de données, mais je ne sais pas si c'est une bonne pratique. Je voudrais connaître les avantages et les inconvénients de le faire de cette façon.

J'ai également pensé à la possibilité d'avoir des "liens" vers ces fichiers, mais cela posera peut-être plus de problèmes que de solutions. Toute expérience dans ce sens sera la bienvenue :)

Remarque: La base de données sera MySQL.

54
David Ameller

Chaque système que je connais qui stocke un grand nombre de gros fichiers les stocke à l'extérieur de la base de données. Vous stockez toutes les données interrogeables pour le fichier (titre, artiste, longueur, etc.) dans la base de données, ainsi qu'un chemin partiel vers le fichier. Quand il est temps de récupérer le fichier, vous extrayez le chemin du fichier, ajoutez-y une racine de fichier (ou URL) et retournez-le.

Ainsi, vous auriez une colonne "emplacement", avec un chemin partiel, comme "a/b/c/1000", que vous mapperiez ensuite à: " http: // myserver/files/a /b/c/1000.mp "

Assurez-vous d'avoir un moyen simple de pointer la base de données des médias vers un autre serveur/répertoire, au cas où vous en auriez besoin pour la récupération des données. En outre, vous pourriez avoir besoin d'une routine qui resynchronise la base de données avec le contenu de l'archive de fichiers.

De plus, si vous comptez avoir des milliers de fichiers multimédias, ne les stockez pas tous dans un répertoire géant - c'est un goulot d'étranglement sur certains systèmes de fichiers. Au lieu de cela, divisez-les en plusieurs sous-arbres équilibrés.

87
Mark Bessey

Je pense que les stocker dans la base de données est correct, tant que vous utilisez une bonne implémentation. Vous pouvez lire cet article plus ancien mais bon pour des idées sur la façon d'empêcher les plus grandes quantités de données dans la base de données d'affecter les performances.

http://www.dreamwerx.net/phpforum/?id=1

J'ai eu des centaines de concerts chargés dans les bases de données mysql sans aucun problème. La conception et la mise en œuvre sont essentielles, faites-le mal et vous en souffrirez.

Plus d'avantages DB (non déjà mentionnés): - Fonctionne mieux dans un environnement à charge équilibrée - Vous pouvez intégrer plus d'évolutivité du stockage backend

16
DreamWerx

Avantages d'utiliser une base de données:

  • Facile à joindre des fichiers audio avec d'autres bits de données.
  • Éviter les opérations d'E/S sur fichiers qui contournent la sécurité de la base de données.
  • Pas besoin d'opérations de séparation pour supprimer les fichiers audio lorsque les enregistrements de la base de données sont supprimés.

Inconvénients de l'utilisation d'une base de données:

  • Ballonnement de la base de données
  • Les bases de données peuvent être plus chères que les systèmes de fichiers
9
Kluge

J'ai expérimenté différents projets en procédant dans les deux sens et nous avons finalement décidé qu'il était plus facile d'utiliser également le système de fichiers. Après tout, le système de fichiers est déjà optimisé pour le stockage, la récupération et l'indexation des fichiers.

La seule astuce que j'aurais à ce sujet est de stocker uniquement un chemin "relatif à la racine" vers le fichier dans la base de données, puis que votre programme ou vos requêtes/procédures stockées/middleware utilisent un paramètre racine spécifique à l'installation pour récupérer le fichier .

Par exemple, si vous stockez XYZ.Wav dans C:\MyProgram\Data\Sounds\X \, le chemin complet serait

C:\MyProgram\Data\Sounds\X\XYZ.Wav

Mais vous devez stocker le chemin d'accès et/ou le nom de fichier dans la base de données sous la forme:

X\XYZ.Wav

Ailleurs, dans la base de données ou dans les fichiers de configuration de votre programme, stockez un chemin racine comme SoundFilePath égal à

C:\MyProgram\Data\Sounds \

Bien sûr, c'est à vous de décider où séparer la racine du chemin de la base de données. De cette façon, si vous déplacez l'installation de votre programme, vous n'avez pas à mettre à jour la base de données.

En outre, s'il doit y avoir lots de fichiers, trouvez un moyen de hacher les chemins afin de ne pas vous retrouver avec un répertoire contenant des centaines ou des milliers de fichiers (dans mon petit exemple, il y a sous-répertoires basés sur le premier caractère du nom de fichier, mais vous pouvez aller plus loin ou utiliser des hachages aléatoires). Cela rend également les indexeurs de recherche heureux.

9
CMPalmer

Quelques avantages de l'utilisation d'objets blob pour stocker des fichiers

  • Frais d'administration réduits - utilisez un seul outil pour sauvegarder/restaurer, etc.
  • Aucune possibilité pour la base de données et le système de fichiers d'être désynchronisés
  • Capacité transactionnelle (si nécessaire)

Quelques inconvénients

  • fait exploser vos serveurs de base de données RAM avec des déchets inutiles qu'il pourrait utiliser pour stocker des lignes, des index, etc.
  • Rend vos sauvegardes DB très volumineuses, donc moins gérables
  • Pas aussi pratique qu'un système de fichiers à servir aux clients (par exemple avec un serveur Web)

Et la performance? Votre kilométrage peut varier. Les systèmes de fichiers sont extrêmement variés, tout comme les bases de données dans leurs performances. Dans certains cas, un système de fichiers gagnera (probablement avec moins de fichiers plus volumineux). Dans certains cas, une base de données peut être meilleure (peut-être avec un très grand nombre de petits fichiers).

Dans tous les cas, ne vous inquiétez pas, faites ce qui vous semble le mieux à l'époque.

Certaines bases de données offrent un serveur Web intégré pour servir les objets blob. Au moment de la rédaction, MySQL ne le fait pas.

4
MarkR

Vous pouvez les stocker en tant que BLOB (ou LONGBLOB), puis récupérer les données lorsque vous souhaitez réellement accéder aux fichiers multimédias.

ou

Vous pouvez simplement stocker les fichiers multimédias sur un lecteur et stocker les métadonnées dans la base de données.

Je penche vers cette dernière méthode. Je ne sais pas comment cela se fait globalement dans le monde, mais je soupçonne que beaucoup d'autres feraient de même.

Vous pouvez stocker des liens (chemins partiels vers les données), puis récupérer ces informations. Permet de déplacer facilement les objets sur les disques et d'y accéder.

Je stocke le chemin relatif de chaque fichier dans la base de données avec d'autres métadonnées sur les fichiers. Le chemin de base peut ensuite être modifié à la volée si j'ai besoin de déplacer les données réelles vers un autre lecteur (local ou via le chemin UNC).

Voilà comment je le fais. Je suis sûr que d'autres auront aussi des idées.

4
itsmatt

Stockez-les en tant que fichiers externes. Enregistrez ensuite le chemin dans un champ varchar. Mettre de gros objets binaires dans une base de données relationnelle est généralement très inefficace - ils n'utilisent que de l'espace et ralentissent les choses car les caches sont remplis sont inutilisables. Et il n'y a rien à gagner - les gouttes elles-mêmes ne peuvent pas être recherchées. Vous voudrez peut-être enregistrer les métadonnées des médias dans la base de données.

3
winwaed

Une solution simple serait de simplement stocker les emplacements relatifs des fichiers sous forme de chaînes et de laisser le système de fichiers le gérer. Je l'ai essayé sur un projet (nous stockions des pièces jointes de fichiers de bureau à une enquête), et cela a bien fonctionné.

1
Josh Kodroff

La meilleure façon de stocker des fichiers audio/vidéo, vous pouvez utiliser n'importe quel stockage distribué qui peut être local ou sur le cloud.

https://min.io/

pour le cloud: AWS S3

0
suren