在PostgreSQL中存储多个二进制文件修订版的最有效方法是什么?

ako*_*sch 5 postgresql binary version-control diff database-design

我在这里寻找数据库中有限形式的版本控制:

  • 大小是最重要的:同一文件的许多修订应该占用尽可能小的空间(我不是在寻找压缩,因为数据已经被压缩了)
  • 计算要求是次要的
  • 我应该能够尽快获取文档的当前版本(获取旧版本不是时间关键)

基本上答案至少应包含两件事:

  • 你会使用什么二元差异算法?
  • 你将如何以PostreSQL特有的方式构建这个系统?

小智 5

"大小是最重要的":如何使用PL/sh作为外部差异工具(如bsdiff?).

"我应该能够尽快获取文档的当前版本":在这种情况下,您将希望以"错误"的方式进行差异,因此每个修订版都涉及:

  1. 将'previous revision'替换为'new revision'和'previous revision'之间的差异
  2. 添加'新版本'

要回到旧版本,则需要迭代地将先前的差异应用为补丁,直到达到所需的修订.

无论你做什么,我认为在使用diff工具之前你需要先解压缩数据.原因如下:

dd if=/dev/urandom of=myfile.1 bs=1024 count=10
cp myfile.1 tmp; cat tmp >> myfile.1
cp myfile.1 tmp; cat tmp >> myfile.1
cp myfile.1 tmp; cat tmp >> myfile.1
cp myfile.1 tmp; cat tmp >> myfile.1
dd if=/dev/urandom of=myfile.2 bs=1024 count=10
cp myfile.2 tmp; cat tmp >> myfile.2
cp myfile.2 tmp; cat tmp >> myfile.2
cp myfile.2 tmp; cat tmp >> myfile.2
cp myfile.2 tmp; cat tmp >> myfile.2
cat myfile.1 >> myfile.2
bsdiff myfile.1 myfile.2 diff
gzip -c myfile.1 > myfile.1.gz
gzip -c myfile.2 > myfile.2.gz
bsdiff myfile.1.gz myfile.2.gz gz.diff
rm tmp
ls -l

-rw-r--r-- 1 root root  17115 2011-04-05 10:54 diff
-rw-r--r-- 1 root root  21580 2011-04-05 10:54 gz.diff
-rw-r--r-- 1 root root 163840 2011-04-05 10:54 myfile.1
-rw-r--r-- 1 root root  11709 2011-04-05 10:54 myfile.1.gz
-rw-r--r-- 1 root root 327680 2011-04-05 10:54 myfile.2
-rw-r--r-- 1 root root  23399 2011-04-05 10:54 myfile.2.gz
Run Code Online (Sandbox Code Playgroud)

请注意,gz.diff大于diff- 如果您尝试使用真实文件,我希望差异更大.