我想在数据库中存储大量的声音文件,但我不知道这是不是一个好习惯.我想知道以这种方式做到这一点的利弊.
我还想到了对这些文件进行"链接"的可能性,但也许这会带来比解决方案更多的问题.欢迎任何这方面的经验:)
注意:数据库将是MySQL.
我所知道的每个存储大量大文件的系统都将它们存储在数据库的外部.您将文件的所有可查询数据(标题,艺术家,长度等)以及文件的部分路径存储在数据库中.当需要检索文件时,您将提取文件的路径,在其前面添加一些文件根目录(或URL),然后返回该文件.
所以,你有一个"位置"列,其中有一个部分路径,比如"a/b/c/1000",然后你可以映射到:" http:// myserver/files/a/b/c /1000.mp3 "
确保您有一种简单的方法将媒体数据库指向不同的服务器/目录,以防您需要进行数据恢复.此外,您可能需要一个例程,将数据库与文件存档的内容重新同步.
此外,如果您将拥有数千个媒体文件,请不要将它们全部存储在一个巨大的目录中 - 这是某些文件系统的性能瓶颈.相反,将它们分解为多个平衡的子树.
我认为只要你使用一个好的实现,就可以将它们存储在数据库中.您可以阅读这篇较旧但很好的文章,了解如何防止数据库中的大量数据影响性能.
http://www.dreamwerx.net/phpforum/?id=1
我已经在mysql数据库中加载了100多个演出而没有任何问题.设计和实施是关键,做错了,你会受苦.
更多数据库优势(尚未提及): - 在负载平衡环境中更好地工作 - 您可以构建更多后端存储可伸缩性
使用数据库的优点:
易于将声音文件与其他数据位连接.
避免绕过数据库安全性的文件i/o操作.
删除数据库记录时,无需分离操作来删除声音文件.
使用数据库的缺点:
数据库臃肿
数据库可能比文件系统更昂贵
我已经在不同的项目中尝试过两种方式,我们最终决定使用文件系统也更容易.毕竟,文件系统已经过优化,可用于存储,检索和索引文件.
我要提到的一个提示是只存储数据库中文件的"根相对"路径,然后让您的程序或查询/存储过程/中间件使用特定于安装的根参数来检索文件.
例如,如果将XYZ.Wav存储在C:\ MyProgram\Data\Sounds\X \中,则完整路径将为
C:\MyProgram\Data\Sounds\X\XYZ.Wav
但是您将路径和/或文件名存储在数据库中:
X\XYZ.Wav
在其他地方,在数据库或程序的配置文件中,存储SoundFilePath等根路径
C:\ MyProgram\DATA \声音\
当然,从数据库路径中分割根的位置取决于您.这样,如果移动程序安装,则不必更新数据库.
此外,如果有很多文件,找到一些散列路径的方法,这样你就不会得到一个包含数百或数千个文件的目录(在我的小例子中,有基于第一个字符的子目录)文件名,但你可以更深入或使用随机哈希).这使得搜索索引器也很开心.