给定任何文件,我想识别具有相同校验和的重复文件。我只想将重复项的文本列表打印到我的终端,因此运行完整的桌面搜索索引器绝对是矫枉过正。
要做我想做的事情,我需要关联地存储两条信息:
-
"[此文件] 对任何文件都有<<em>XYZ 校验和>"
-
"[这里是所有文件] 用于<<em>XYZ 校验和>",用于任何校验和
问题是我需要数据库是可编辑的,以便当我移动数据并通知管理数据库的脚本时,它可以跟上更改。我想到了两种方法。
一种是使用基于偏移量的平面文件索引,但我需要实现一个碎片方案,以便我可以在数据移动时使用新文件扩展目录表示形式,而不必不断地向前和向后位移整个文件以适应数据重组。
虽然对我来说并非不可能做到,但这对我来说足够重要,以至于我会担心数据库的一致性和完整性,并且由于我将决定是否从这些信息后面删除数据,因此在我决定使用它之前,我会玩一段时间这样的实现。
我没有使用传统数据库的经验,但我想象SQL可能比自己实现整个存储框架更容易实现我想要做的事情。如果这是一个选择,那么哪里会是一个好的起点?我初步推测我可以创建两个表:第一个将列出第一列(主)列中的每个校验和,以及该校验和在第二列中匹配的每个文件的 NUL 分隔字符串;第二个表将在第一列/主列中列出文件的完整路径,在第二列中列出其校验和。更新此系统需要我简单地修改两个表中的列,并且比上面建议的方法简单/容易得多。
一个包含 2 列的数据库表:File
和 ChecSum
。 文件(显示为完整路径)本质上是UNIQUE
的,可以用作UNIQUE INDEX
。 您可能仍希望添加ID
字段(整数代码)作为PRIMARY KEY
,特别是如果您想将moving
或renaming
视为单个操作,而不是将其拆分为delete
后跟create
。
在MySQL(用作示例)中,您将拥有类似以下内容(不带ID
列):
DDL 和 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
('dir1file1', 56789),
('dir2file2', 77777),
('dir3dir4file9', 56789),
('dirAfile1', 12345)
;
DOL:
-- All files
SELECT *
FROM Files;
-- All files with checksum = 56789
SELECT *
FROM Files
WHERE checksum = 56789;
-- File name 'dirAfile1'
SELECT *
FROM Files
WHERE file = 'dirAfile1';
SQL 摆弄上述内容