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 savoir les avantages et les inconvénients de le faire de cette façon.

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

Note: La base de données sera MySQL.

53
demandé sur Benjamin 2008-09-30 23:58:30

8 réponses

Chaque système que je connais stocke un grand nombre de gros fichiers les stocke en externe dans 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 une racine de fichier (ou une URL) et renvoyez-le.

Donc, vous auriez une colonne "location", Avec un chemin partiel, comme "A/b/C / 1000", que vous mappez ensuite de: "http://myserver/files/a/b/c/1000.mp3"

Assurez-vous que vous avez un moyen facile de pointer la base de données multimédia vers un serveur/répertoire différent, au cas où vous en auriez besoin pour la récupération de données. Aussi, vous pourriez avoir besoin d'une routine qui re-synchronise la base de données avec le contenu du fichier archive.

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

86
répondu Mark Bessey 2008-09-30 20:11:41

Je pense que les stocker dans la base de données est ok, 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 de garder 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 littéralement 100 de concerts chargés dans des bases de données mysql sans aucun problème. La conception et la mise en œuvre est la clé, faites-le mal et vous allez souffrir.

Plus D'avantages DB (pas déjà mentionner): - Fonctionne mieux dans un environnement équilibré de charge - Vous pouvez construire plus d'évolutivité de stockage backend

16
répondu DreamWerx 2008-09-30 20:11:22

J'ai expérimenté dans différents projets avec le faire dans les deux sens et nous avons finalement décidé qu'il est 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.

La seule astuce que j'aurais à ce sujet est de ne stocker qu'un chemin "root relatif" vers le 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 récupérer le fichier.

Par exemple, si vous stockez XYZ.Wav in 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 de 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 comme SoundFilePath égal à

C:\MyProgram\Data\Sounds\

Bien sûr, l'endroit où vous divisez la racine du chemin de la base de données dépend de vous. De cette façon, si vous déplacez l'installation de votre programme, vous ne pas avoir à mettre à jour la base de données.

Aussi, s'il y a beaucoup de fichiers, trouvez un moyen de hacher les chemins pour ne pas vous retrouver avec un répertoire contenant des centaines ou des milliers de fichiers (dans mon petit exemple, il y a 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 les indexeurs de recherche heureux aussi bien.

9
répondu CMPalmer 2008-09-30 20:12:02

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

  • Facile à joindre des fichiers audio avec d'autres bits de données.
  • Éviter les opérations d'e/s de fichiers qui contourner la sécurité de la base.
  • Pas besoin d'opérations de séparation pour supprimer les fichiers audio lorsque la base de données les enregistrements 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
7
répondu Kluge 2008-09-30 20:04:48

Vous pouvez les stocker en tant que BLOBs (ou LONGBLOBs), puis récupérer les données lorsque vous souhaitez 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 la même chose.

Vous pouvez stocker des liens (chemins partiels vers les données), puis récupérer ces informations. Facilite l' déplacez les choses sur les lecteurs et y accéder toujours.

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 sur un autre lecteur (local ou via UNC path).

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

4
répondu itsmatt 2008-09-30 20:04:40

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

  • réduire les frais généraux de gestion-utiliser un seul outil pour sauvegarder / restaurer etc
  • aucune possibilité de désynchronisation de la base de données et du système de fichiers
  • Capacité transactionnelle (si nécessaire)

Quelques inconvénients

  • explose 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 gérables
  • Pas comme pratique en tant que 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, de même que les bases de données dans leurs performances. Dans certains cas, un système de fichiers gagnera (probablement avec moins de fichiers plus gros). 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 semble le mieux à l'époque.

Certaines bases de données offrent un serveur web intégré pour servir des gouttes. Au moment de l'écriture, MySQL ne le fait pas.

3
répondu MarkR 2008-09-30 20:25:13

Les stocker en tant que fichiers externes. Enregistrez ensuite le chemin dans un champ varchar. Mettre de gros blobs 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 blobs eux-mêmes ne peuvent pas être fouillés. Vous pouvez cependant enregistrer des méta-données multimédias dans la base de données.

2
répondu winwaed 2011-01-04 17:36:26

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 office à une enquête), et cela a bien fonctionné.

1
répondu Josh Kodroff 2008-09-30 20:01:12