我想在数据库中存储大量声音文件,但我不知道这是不是一个好习惯。我想知道以这种方式这样做的利弊。
我还想到了对这些文件进行“链接”的可能性,但这可能比解决方案带来更多问题。欢迎任何这方面的经验:)
注意:数据库将是MySQL。
答案 0 :(得分:87)
我所知道的每个存储大量大文件的系统都将它们存储在数据库的外部。您将文件的所有可查询数据(标题,艺术家,长度等)以及文件的部分路径存储在数据库中。当需要检索文件时,您需要提取文件的路径,在其前面添加一些文件根目录(或URL),然后返回该文件。
因此,您有一个“位置”列,其中包含部分路径,例如“a / b / c / 1000”,然后您将其映射到: “http://myserver/files/a/b/c/1000.mp3”
确保您可以轻松地将媒体数据库指向不同的服务器/目录,以防您需要进行数据恢复。此外,您可能需要一个例程,将数据库与文件存档的内容重新同步。
此外,如果您要拥有数千个媒体文件,请不要将它们全部存储在一个巨大的目录中 - 这是某些文件系统的性能瓶颈。相反,将它们分解为多个平衡的子树。
答案 1 :(得分:16)
我认为只要你使用一个好的实现,就可以将它们存储在数据库中。您可以阅读这篇较旧但很好的文章,了解如何防止数据库中的大量数据影响性能。
http://www.dreamwerx.net/phpforum/?id=1
我已经在mysql数据库中加载了100多个演出而没有任何问题。设计和实施是关键,做错了,你会受苦。
更多数据库优势(尚未提及): - 在负载平衡的环境中更好地工作 - 您可以构建更多的后端存储可伸缩性
答案 2 :(得分:9)
我已经在不同的项目中尝试过两种方式,我们最终决定使用文件系统也更容易。毕竟,文件系统已经过优化,可用于存储,检索和索引文件。
我要提到的一个提示是只存储数据库中文件的“根相对”路径,然后让您的程序或查询/存储过程/中间件使用特定于安装的根参数检索文件。
例如,如果将XYZ.Wav存储在C:\ MyProgram \ Data \ Sounds \ X \中,则完整路径为
C:\MyProgram\Data\Sounds\X\XYZ.Wav
但是您将路径和/或文件名存储在数据库中:
X\XYZ.Wav
在其他地方,在数据库或程序的配置文件中,存储一个类似于SoundFilePath的根路径
C:\ MyProgram \数据\声音\
当然,从数据库路径中分割根的位置取决于您。这样,如果移动程序安装,则不必更新数据库。
此外,如果要有 lot 的文件,找到一些散列路径的方法,这样就不会有一个包含数百或数千个文件的目录(在我的小例子中) ,有基于文件名的第一个字符的子目录,但你可以更深入或使用随机哈希)。这使得搜索索引器也很开心。
答案 3 :(得分:8)
使用数据库的好处:
使用数据库的缺点:
答案 4 :(得分:4)
您可以将它们存储为BLOB(或LONGBLOB),然后在您想要实际访问媒体文件时检索数据。
或
您只需将媒体文件存储在驱动器上,然后将元数据存储在数据库中。
我倾向于后一种方法。我不知道这是如何在全世界范围内完成的,但我怀疑其他许多人会这样做。
您可以存储链接(数据的部分路径),然后检索此信息。可以轻松地在驱动器上移动并仍可访问它。
我存储数据库中每个文件的相对路径以及有关文件的其他元数据。如果我需要将实际数据重新定位到另一个驱动器(本地或通过UNC路径),则可以动态更改基本路径。
我就是这样做的。我相信其他人也会有想法。
答案 5 :(得分:3)
使用blob存储文件的一些优点
一些缺点
性能怎么样?你的旅费可能会改变。文件系统变化很大,数据库的性能也是如此。在某些情况下,文件系统将获胜(可能使用较少的较大文件)。在某些情况下,数据库可能会更好(可能有很多小的文件)。
无论如何,不要担心,做当时最好的事情。
某些数据库提供内置的Web服务器来提供blob。在撰写本文时,MySQL没有。
答案 6 :(得分:3)
将它们存储为外部文件。然后将路径保存在varchar字段中。将大型二进制blob放入关系数据库通常效率非常低 - 它们只占用空间并且因为填充缓存无法使用而减慢速度。并且没有什么可以获得的 - 斑点本身无法被搜索。您可能希望将媒体元数据保存到数据库中。
答案 7 :(得分:1)
一个简单的解决方案是将文件的相对位置存储为字符串,然后让文件系统处理它。我已经尝试过一个项目(我们将办公室文件附件存储到调查中),它运行良好。
答案 8 :(得分:0)