表示文件系统的可编辑校验和索引的最佳方法是什么?

时间:2015-02-04 05:08:13

标签: sql database checksum flat-file

鉴于任何文件,我想识别具有相同校验和的重复文件。我只是想将重复项的文本列表打印到我的终端,因此运行完整的桌面搜索索引器绝对有点过分。

为了做我想做的事,我需要以关联方式存储两条信息:

  1. " [此文件]具有< XYZ 校验和>",对于任何文件

  2. " [以下是所有文件]< XYZ 校验和>",任何校验和

    < / LI>

    问题在于我需要数据库是可编辑的,这样当我移动数据时 - 并通知管理数据库的脚本 - 它可以跟上变化。我有两种方法可以做到这一点。

    一种方法是使用基于偏移量的flatfile索引,但我需要实现一个碎片方案,这样我可以在数据移动时用新文件扩展目录表示,而不必经常向前和向后移位整个文件适应数据重组 虽然我不是不可能做到这一点,但这对于我对数据库的一致性和完整性感到担忧是非常重要的,因为我决定是否从这些信息的背面删除数据我就是这样做的。在我决定使用它之前,暂时玩这样的实现。

    我没有使用传统数据库的经验,但是我想象SQL可能比我自己实现整个存储框架更容易实现我想要做的事情。如果这是一个选项,哪里是一个好的起点?我暂时推断我可以创建两个表:第一个列出第一个(主)列中的每个校验和,以及第二列中该校验和匹配的每个文件的NUL分隔字符串;第二个表将列出第一个/主要列中文件的完整路径,以及第二个表中的校验和。对这个系统的更新需要我简单地修改两个表中的列,并且比上面建议的方法更简单/更容易。

1 个答案:

答案 0 :(得分:1)

您需要一个包含2列的数据库表:FileChecSum。文件(显示为完整路径)本质上为UNIQUE,可用作UNIQUE INDEX。您可能仍希望将ID字段(整数代码)添加为PRIMARY KEY,特别是如果您要将movingrenaming视为单个操作而不是将其拆分为delete后跟create

在MySQL(用作示例)中,您将有类似的内容(没有ID列):

<强> DDL and DML

CREATE TABLE Files
    (`File` varchar(16), `CheckSum` int)
;

ALTER TABLE Files ADD UNIQUE INDEX (File), ADD INDEX (CheckSum);

INSERT INTO Files
    (`File`, `CheckSum`)
VALUES
    ('\dir1\file1', 56789),
    ('\dir2\file2', 77777),
    ('\dir3\dir4\file9', 56789),
    ('\dirA\file1', 12345)
;

<强> DOL

-- All files
SELECT * 
FROM Files;

-- All files with checksum = 56789
SELECT * 
FROM Files
WHERE checksum = 56789;

-- File name '\dirA\file1'
SELECT *
FROM Files 
WHERE file = '\dirA\file1';

SQL Fiddle with the above