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

5
我在这里寻求数据库中有限的版本控制形式:
  • 尺寸最为重要:同一文件的多个修订版应占用尽可能小的空间(我不需要压缩,因为数据已经压缩)
  • 计算要求次之
  • 我应该能够尽快获取文档的当前修订版(获取旧版不是时间关键)
基本上答案应该包含至少两个方面:
  • 您会使用哪种二进制差异算法?
  • 您将如何以PostgreSQL特定的方式构建此系统?
2个回答

5
“尺寸非常重要”:比如使用外部差异工具(如bsdiff),例如使用PL/sh
“我应该尽可能快地获取文档的当前版本”:在这种情况下,您需要以“错误”的方式进行差异比较,因此每个修订版都会涉及以下内容:
1. 用“新修订版”和“上一个修订版”之间的差异替换“上一个修订版” 2. 添加“新修订版”
然后,要返回旧版本,需要迭代地将先前的差异作为补丁应用,直到获得所需的修订版。
无论您做什么,我认为您需要在使用差异工具之前先解压缩数据。原因如下:
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

请注意,gz.diff 大于 diff - 如果您使用真实文件进行测试,我预计差异会更大。

谢谢您的回答:您能详细解释一下为什么我需要在使用diff工具之前解压缩我的数据吗? - akosch

2
我不太喜欢重新发明轮子。在存储空间优化方面,比我聪明得多的人已经找到了解决方案。如果可能的话,我更愿意利用这些非常聪明的人的辛勤工作。话虽如此,一旦我了解了Mercurial或Git等版本控制系统如何存储二进制数据,我可能会考虑将文件存储在其中之一中。一旦确定要使用哪个版本控制系统,您可以查看创建一些存储函数的方法,最有可能是在pl / perl或类似的语言中,这些函数可以与版本控制系统交互,并弥合PostgreSQL中关系数据和二进制文件之间的差距。
我对这种方法唯一的问题是,我不太喜欢将事务性系统引入外部系统(Mercurial / Git)中。而且,数据库备份不会备份我的Mercurial或Git存储库。但总会有一个权衡,所以只需找出哪些是您可以接受的即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接