将目录中的数据同步到数据库的实用方法是什么?

时间:2009-11-17 19:03:34

标签: mysql ruby algorithm synchronization sql

我的情况涉及一个包含MP3文件的目录,以及一个应该包含该目录中MP3文件中所有MP3元数据(即流派,艺术家姓名,专辑名称和曲目名称)的数据库。数据库应始终反映目录中的内容,即...我正在搜索的算法永远不应该从目录中删除项目,只能从数据库中删除。目录是原始目录,数据库应该是程序运行后目录的精确副本,目录应该保持不受程序的影响。

根据我的理解,我相信当我遇到目录中找不到但在数据库中找不到的MP3元数据时,我必须遍历插入记录在数据库中的目录的内容。然后,遍历数据库的内容并从数据库中删除目录中找不到的内容。

是否存在用于同步两个目录和数据库的通用算法?有没有比我概述的更好的方法呢?

我正在尝试使用Ruby Sequel和MySQL完成此任务,以防万一。

为了澄清,假设所有MP3标签数据都是正确的。我通过自动MP3标记器运行所有文件,并确保在将其移动到此目录之前准确标记所有文件。

我首选的解决方案是手动运行Ruby脚本,而不是使用Cron。我的理由是因为它是我已经用来实现大部分项目的语言,我必须手动标记所有MP3文件并验证它们是否正确,所以我不希望任何脚本运行,直到我可以验证所有我的MP3目录中的文件很适合。

2 个答案:

答案 0 :(得分:0)

您可以使用2个cron预定脚本处理此问题。

第一个脚本可以扫描目录并查找mod日期大于上次执行扫描的文件(或基于DB中的最新记录)。找到新文件后,脚本可以执行插入操作。

您可以阅读MP3的ID3标签以获取您要查找的大部分元数据,但这假设您的所有文件都包含此数据。您需要考虑数据丢失时发生的回退机制,例如使用文件名。

删除脚本可以反向运行。您需要在数据库中保留一个字段,该字段包含目录中文件的相对路径。然后,您可以遍历数据库记录并检查每个文件是否存在。如果找不到,您可以将ID添加到列表中。扫描完成后,您可以对捕获的ID执行delete语句。

答案 1 :(得分:0)

就一般策略而言,

webguydan的策略有一个脚本循环文件和数据库记录,并比较它们,向后和向前。您可以通过更多地利用数据库来做得更好。

注意这里会有什么用,哪些不会很慢:数据库插入是最快的数据库操作。您最慢的操作可能是读取文件系统MP3元数据。对文件系统或数据库的单次调用比设置操作(获取文件列表)要昂贵得多。特别是,检查数百行是否存在文件的删除操作将非常慢。

策略2.在数据库中创建临时表以执行比较。您的脚本会读取所有mp3并将它们插入到临时表中,该表是mp3表的空副本。然后,您可以加入真实表来识别移动,删除和添加。

策略3:只需替换整个数据库表。我怀疑这个操作的缓慢部分将是读取mp3元数据,而不是任何数据库操作。由于您的进程无论如何都要读取所有mp3元数据以识别更改,因此只需在每次刷新时替换整个sql数据库。

我会从这种方法开始,并根据需要进行优化。如果您在mp3 sql数据库中存储了无法从文件系统替换的其他信息,则无法替换。

策略4:根据您的操作系统版本,提取mp3元数据可能很慢(或者可能不是?)通过在登台表中读取路径,名称,更新日期,跳过读取文件系统的慢速部分(元数据?)。简单的SQL查询可以识别需要更新(读取mp3数据),从表中删除或插入的文件。

其他方法:请注意,许多操作系统和产品已经允许对您正在讨论的数据进行数据库样式查询。例如,MS索引服务。