66

我想在数据库中存储大量的声音文件,但我不知道这是否是一个好习惯。我想知道这样做的利弊。

我还考虑了与这些文件建立“链接”的可能性,但也许这会带来比解决方案更多的问题。欢迎任何这方面的经验:)

注意:数据库将是 MySQL。

4

9 回答 9

109

我知道的每个存储大量大文件的系统都将它们存储在数据库外部。您将文件的所有可查询数据(标题、艺术家、长度等)以及文件的部分路径存储在数据库中。当需要检索文件时,您提取文件的路径,在其前面添加一些文件根(或 URL),然后返回。

因此,您将有一个“位置”列,其中包含部分路径,例如“a/b/c/1000”,然后您将其映射到:“ http://myserver/files/a/b/c /1000.mp3 "

确保您有一种简单的方法将媒体数据库指向不同的服务器/目录,以防您需要它来进行数据恢复。此外,您可能需要一个将数据库与文件存档内容重新同步的例程。

此外,如果您将拥有数千个媒体文件,请不要将它们全部存储在一个巨大的目录中——这对某些文件系统来说是一个性能瓶颈。相反,将它们分解为多个平衡的子树。

于 2008-09-30T20:11:41.127 回答
18

我认为将它们存储在数据库中是可以的,只要你使用一个好的实现。您可以阅读这篇较早但很好的文章,了解如何防止数据库中的大量数据影响性能。

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

我已经在 mysql 数据库中加载了 100 个演出,没有任何问题。设计和实现是关键,做错了,你会受苦。

更多数据库优势(尚未提及): - 在负载平衡的环境中工作得更好 - 您可以构建更多的后端存储可扩展性

于 2008-09-30T20:11:22.077 回答
9

使用数据库的优点:

  • 易于将声音文件与其他数据位连接起来。
  • 避免绕过数据库安全的文件 i/o 操作。
  • 删除数据库记录时无需分离操作删除声音文件。

使用数据库的缺点:

  • 数据库膨胀
  • 数据库可能比文件系统更昂贵
于 2008-09-30T20:04:48.287 回答
9

我已经在不同的项目中尝试了两种方式,我们最终决定使用文件系统也更容易。毕竟,文件系统已经针对存储、检索和索引文件进行了优化。

我对此的一个提示是仅在数据库中存储文件的“根相对”路径,然后让您的程序或查询/存储过程/中间件使用安装特定的根参数来检索文件.

例如,如果您将 XYZ.Wav 存储在 C:\MyProgram\Data\Sounds\X\ 中,则完整路径为

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

但是您可以将数据库中的路径和/或文件名存储为:

X\XYZ.Wav

在其他地方,在数据库或程序的配置文件中,存储一个根路径,如 SoundFilePath 等于

C:\MyProgram\Data\Sounds\

当然,从数据库路径中拆分根目录的位置取决于您。这样,如果您移动程序安装,您就不必更新数据库。

此外,如果有很多文件,请找到一些散列路径的方法,这样你就不会得到一个包含数百或数千个文件的目录(在我的小例子中,有基于第一个字符的子目录文件名,但您可以更深入或使用随机哈希)。这也使搜索索引器感到高兴。

于 2008-09-30T20:12:02.857 回答
5

使用 blob 存储文件的一些优点

  • 降低管理开销 - 使用单一工具来备份/恢复等
  • 数据库和文件系统不可能不同步
  • 交易能力(如果需要)

一些缺点

  • 用可以用来存储行、索引等的无用垃圾来炸毁数据库服务器的 RAM
  • 使您的数据库备份非常大,因此不易管理
  • 不像文件系统那样方便地为客户端提供服务(例如,使用 Web 服务器)

性能呢?你的旅费可能会改变。文件系统千差万别,数据库的性能也千差万别。在某些情况下,文件系统会胜出(可能有更少的大文件)。在某些情况下,数据库可能会更好(可能有大量的小文件)。

无论如何,别担心,做当时看起来最好的事情。

一些数据库提供了一个内置的 Web 服务器来服务 Blob。在撰写本文时,MySQL 还没有。

于 2008-09-30T20:25:13.620 回答
4

您可以将它们存储为 BLOB(或 LONGBLOB),然后在您想要实际访问媒体文件时检索数据。

或者

您可以简单地将媒体文件存储在驱动器上,并将元数据存储在数据库中。

我倾向于后一种方法。我不知道这在世界上是如何完成的,但我怀疑许多其他人也会这样做。

您可以存储链接(数据的部分路径),然后检索此信息。可以轻松地在驱动器上移动东西并仍然可以访问它。

我将每个文件的相对路径与有关文件的其他元数据一起存储在数据库中。如果我需要将实际数据重新定位到另一个驱动器(本地或通过 UNC 路径),则可以即时更改基本路径。

我就是这样做的。我相信其他人也会有想法。

于 2008-09-30T20:04:40.253 回答
4

将它们存储为外部文件。然后将路径保存在 varchar 字段中。将大型二进制 blob 放入关系数据库通常效率很低 - 它们只会占用空间,并且在缓存被填充时会减慢速度,这是不可用的。而且没有任何收获 - 无法搜索 blob 本身。不过,您可能希望将媒体元数据保存到数据库中。

于 2011-01-04T17:36:26.437 回答
2

一个简单的解决方案是将文件的相对位置存储为字符串并让文件系统处理它。我已经在一个项目中尝试过(我们将办公文件附件存储到调查中),并且效果很好。

于 2008-09-30T20:01:12.320 回答
0

存储音频/视频文件的最佳方式是,您可以使用本地或云端的任何分布式存储。

https://min.io/

云:AWS S3

于 2019-05-06T05:44:18.050 回答