Quel est le meilleur moyen de stocker des fichiers multimédias sur une base de données?

StackOverflow https://stackoverflow.com/questions/154707

Question

Je souhaite stocker un grand nombre de fichiers audio dans une base de données, mais je ne sais pas si c'est une bonne pratique. J'aimerais connaître le pour et le contre de le faire de cette manière.

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

Remarque: la base de données sera MySQL.

Était-ce utile?

La solution

Tous les systèmes que je connais qui stocke un grand nombre de gros fichiers les stockent en externe dans la base de données. Vous stockez toutes les données interrogeables du fichier (titre, artiste, longueur, etc.) dans la base de données, ainsi qu'un chemin d'accès partiel au fichier. Lorsque le moment est venu de récupérer le fichier, vous extrayez le chemin du fichier, ajoutez-y un nom de fichier racine (ou une URL) et renvoyez-le.

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

Assurez-vous de disposer d’un moyen simple de pointer la base de données de supports sur un serveur / répertoire différent, au cas où vous en auriez besoin pour la récupération des données. De plus, vous aurez peut-être besoin d'une routine qui resynchronise la base de données avec le contenu de l'archive de fichiers.

De même, si vous avez des milliers de fichiers multimédias, ne les stockez pas tous dans un seul répertoire géant: il s'agit d'un goulot d'étranglement des performances sur certains systèmes de fichiers. Au lieu de cela, divisez-les en plusieurs sous-arbres équilibrés.

Autres conseils

Je pense que les stocker dans la base de données est correct, à condition que vous utilisiez une bonne implémentation. Vous pouvez lire cet article ancien, mais utile, pour savoir comment éviter que de grandes quantités de données dans la base de données n'affectent les performances.

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

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

Autres avantages de la base de données (non déjà mentionnés): - Fonctionne mieux dans un environnement à charge équilibrée - Vous pouvez intégrer davantage d'évolutivité de stockage back-end

J'ai déjà expérimenté différents projets et nous avons finalement décidé qu'il était également plus facile d'utiliser 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.

Le seul conseil que je voudrais à ce sujet est de ne stocker qu'un "parent relatif à la racine". chemin d'accès au fichier dans la base de données, puis demandez à votre programme ou à vos requêtes / procédures stockées / middle-ware d'utiliser un paramètre racine spécifique à l'installation pour extraire 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 stockeriez le chemin et / ou le nom du fichier dans la base de données comme suit:

X\XYZ.Wav

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

C: \ MyProgram \ Data \ Sounds \

Bien sûr, vous pouvez choisir de séparer la racine du chemin de la base de données. Ainsi, si vous déplacez l'installation de votre programme, vous n'avez pas à mettre à jour la base de données.

De même, s'il doit y avoir beaucoup de fichiers, trouvez un moyen de hacher les chemins afin d'éviter de vous retrouver avec un seul répertoire contenant des centaines ou des milliers de fichiers (dans mon petit exemple , il existe des 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.

Avantages de l'utilisation d'une base de données:

  • Facile à joindre des fichiers son avec d’autres bits de données.
  • Eviter les opérations d’entrées / sorties de fichiers qui contourner la sécurité de la base de données.
  • Plus besoin d'opérations de séparation supprimer les fichiers son lorsque la base de données les enregistrements sont supprimés.

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

  • Flot de base de données
  • Les bases de données peuvent coûter plus cher que les systèmes de fichiers

Vous pouvez les stocker sous forme de BLOB (ou LONGBLOB), puis récupérer les données lorsque vous souhaitez accéder aux fichiers multimédias.

ou

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

Je me penche vers cette dernière méthode. Je ne sais pas comment cela se fait 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. Il est facile de déplacer des objets sur des lecteurs et d'y accéder quand même.

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 je dois déplacer les données réelles sur un autre lecteur (local ou via le chemin UNC).

C'est comme ça que je le fais. Je suis sûr que d'autres auront aussi des idées.

Quelques avantages de l'utilisation de blobs pour stocker des fichiers

  • Réduisez les frais de gestion - utilisez un seul outil pour sauvegarder / restaurer, etc.
  • Impossible pour la base de données et le système de fichiers de ne pas être synchronisés
  • Capacité transactionnelle (si nécessaire)

Quelques inconvénients

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

Qu'en est-il de 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 certains cas, un système de fichiers va gagner (probablement avec moins de fichiers volumineux). Dans certains cas, une base de données peut être meilleure (peut-être avec un très grand nombre de fichiers de petite taille).

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

Certaines bases de données offrent un serveur Web intégré pour la gestion des blobs. Au moment de la rédaction de ce document, MySQL ne le sait pas.

Stockez-les en tant que fichiers externes. Enregistrez ensuite le chemin dans un champ varchar. Placer de gros blobs binaires dans une base de données relationnelle est généralement très inefficace - ils ne consomment que de l’espace et ralentissent le processus car les caches sont remplis sont inutilisables. Et il n'y a rien à gagner - les blobs eux-mêmes ne peuvent pas être fouillés. Toutefois, vous souhaiterez peut-être enregistrer les métadonnées du média dans la base de données.

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

La meilleure façon de stocker des fichiers audio / vidéo consiste à utiliser n'importe quel stockage distribué local ou sur le cloud.

https://min.io/

pour le cloud: AWS S3

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top