2008-09-30 122 views
47

我想将大量的声音文件存储在数据库中,但我不知道这是否是一种好的做法。我想知道这样做的利弊。将媒体文件存储在数据库上的最佳方式是什么?

我也认为有可能与这些文件有“链接”,但也许这会带来比解决方案更多的问题。任何在这方面的经验都会受到欢迎:)

注意:数据库将是MySQL。

回答

78

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

所以,你有一个 “位置” 一栏,里面有部分路径,如 “A/B/C/1000”,然后您可以映射到: “http://myserver/files/a/b/c/1000.mp3

确保您可以轻松地将媒体数据库指向不同的服务器/目录,以防您需要进行数据恢复。另外,您可能需要一个例程来重新同步数据库与文件存档的内容。另外,如果您要拥有数千个媒体文件,请不要将它们全部存储在一个巨大的目录中 - 这是某些文件系统的性能瓶颈。相反,将它们分解成多个平衡的子树。

+0

好帖子!我没有复制你,我正在输入我的答案,而你张贴:-) – CMPalmer 2008-09-30 20:13:03

+1

这个实现有可扩展性的问题,当你得到2+ webservers你的烤。 – DreamWerx 2008-09-30 20:16:11

1

一个简单的解决方案是将文件的相对位置存储为字符串,并让文件系统处理它。我已经在一个项目上试了一下(我们在一份调查中存储了办公文件附件),并且它运行良好。

+0

你是如何对待文件命名的? – 2008-09-30 20:04:25

3

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

你可以简单地将媒体文件存储在硬盘上,并存储在数据库中的元数据。

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

您可以存储链接(数据的部分路径),然后检索此信息。使移动硬盘上的东西变得很容易,并且仍然可以访问它。

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

这就是我如何做到的。我相信别人也会有想法。

7

优点使用数据库:

  • 容易加入声音文件与其他 数据位。
  • 避免文件I/O操作, 绕过数据库安全。
  • 不需要分离操作到 当删除数据库 记录时删除声音文件。使用数据库的

缺点:

  • 数据库膨胀
  • 数据库可以比文件系统更加昂贵
15

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

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

我已经从字面上100在MySQL数据库加载没有任何问题的违规记录。设计和实施是关键,做错了,你会受苦。

更多DB优势(尚未提及): - 适用于负载更平衡的环境 - 您可以在多个后端存储的可扩展性建立

+0

我想用这个..我希望这个东西仍然很好,还是有更好的解决方案吗? – Manu 2014-01-23 06:42:01

8

我已经在不同的项目中做过两种尝试,最终我们决定使用文件系统也更容易。毕竟,文件系统已经被优化用于存储,检索和索引文件。

我会想到的一个提示是只存储数据库中文件的“根相对”路径,然后让程序或查询/存储过程/中间件使用安装特定的根参数检索文件。

例如,如果您存储XYZ.Wav在C:\ MyProgram \ DATA \声音\ X \的完整路径将是

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

但你将存储在数据库中的路径和文件名或:

X\XYZ.Wav 

在其他地方,在数据库中或在你的程序的配置文件,存储像SoundFilePath等于

下的根路径:\ MyProgram \ DATA \声音\

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

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

3

使用斑点来存储文件

  • 降低管理开销的一些优点 - 使用单个工具来备份/恢复等
  • 没有可能性的数据库和文件系统不同步
  • 事务能力(如果需要)

一些缺点

  • 炸毁你的数据库服务器的内存无用的垃圾它可以被用来存储行,索引等
  • 让你的数据库备份非常大,因此难以管理
  • 不是很方便的文件系统,以服务客户(例如与Web服务器)

性能如何呢?你的旅费可能会改变。文件系统非常多样化,数据库的性能也是如此。在某些情况下,文件系统会获胜(可能只有更少的大文件)。在某些情况下,数据库可能会更好(可能有很多小文件)。

在任何情况下,不要担心,做什么似乎当时最好的。

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

2

将它们存储为外部文件。然后将路径保存在varchar字段中。将大型二进制blob放入关系数据库通常效率非常低 - 它们只会占用空间并且在缓存填满时会使速度变慢而无法使用。没有什么可以获得的 - 斑点本身不能被搜索。您可能想要将媒体元数据保存到数据库中。

相关问题