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

标签 mysql ruby algorithm synchronization sql

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

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

是否有一个通用的算法来同步目录和数据库这两个东西?有没有比我概述的更好的方法来做到这一点?

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

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

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

最佳答案

在一般策略方面,

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

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

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

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

我将从这种方法入手,并在需要时进行优化。如果您存储在 mp3 sql 数据库中的其他信息无法从文件系统中替换,则替换将不起作用。

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

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

关于mysql - 将目录中的数据同步到数据库的实用方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1751031/

相关文章:

php - 如何将 SQL-View 与 PQGrid 结合使用并保存到数据库

sql - RubyODBC 无法分配 SQLHENV

ruby - 如何在 Ruby 中查找所有引用的文件

algorithm - 关于分配,动态规划。让我的代码更有效率?

python - DP求解0和1个数相等的连续子数组的最大长度

mysql - 查询返回矩阵

mysql - 如何检查 mysql dbi Perl 中的重复键?

algorithm - 内存分配器的 "killer adversary"?

php - `where` 子句中的未知列

css - ruby rails : Required input field CSS not showing