我们正在运行一个评估平台,用户可以在其中评论某些事情。一个关键功能是人们只能评论一次,并且每个评论都是匿名的。
我们将Postgres用于所有数据。我们想在用户创建评论的数据库中保存一个标志(因此他们不能再次发表评论)。在一个单独的表中但在同一事务中,我们希望保存注释本身而不与用户建立任何链接。
然而,postgres的保存插入到数据库中(每元组的事务ID xmin
的的系统列)。因此,现在我们必须避免用户与他们的评论之间存在链接!
可能的(非)解决方案
单独执行清理操作无济于事,因为它不会清除事务ID。请参阅postgres文档中 “ 24.1.5。防止事务ID环绕失败”部分中的“注释”框。
将这些插入内容放入不同的事务中并不能解决任何问题,因为事务ID是连续的。
我们可以将多个用户的评论聚集到带有分隔符的数据库中的一个大文本中,但是由于postgres至少会保留该大文本的旧版本,直到下一个真空,这似乎并不是一个完整的解决方案。此外,我们仍然可以按照用户添加评论的顺序排列,这很好,也可以不保存。
定期重新写入这些表中的所有元组(通过对它们全部进行虚拟UPDATE),然后进行清除操作可能会充分擦除“插入历史记录”,但这似乎也很粗糙。
postgres中是否还有其他方法无法重建表的插入历史记录?