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