我们正在运行一个评估平台,用户可以在其中对某些事情发表评论。一个关键的特点是人们只能发表一次评论,而且每条评论都是匿名的。
我们对所有数据都使用 Postgres。我们想在数据库中保存一个用户创建评论的标志(这样他们就不能再次评论)。在单独的表中但在同一事务中,我们希望保存评论本身而不与用户建立任何链接。
但是,postgres 会保存插入数据库的每个元组的事务 ID(system columns 的 xmin
)。所以现在用户和他们的评论之间存在我们必须避免的链接!
可能的(非)解决方案
单独清理没有帮助,因为它不会清除事务 ID。请参阅“24.1.5. 防止事务 ID 环绕失败”部分中的“注释”框 in the postgres docs .
将这些插入放在不同的事务中,并不能真正解决任何问题,因为事务 ID 是连续的。
我们可以将来自多个用户的评论聚合成数据库中带有一些分隔符的一个大文本,但是由于这个大文本的旧版本至少会被 postgres 保留到下一个 vacuum,所以这看起来不像一个完整的解决方案。此外,我们仍然有用户添加评论的顺序,最好不要保存。
定期重写这些表中的所有元组(通过对所有表进行虚拟更新),然后清空可能会充分删除“插入历史记录”,但这看起来也很粗糙。
在 postgres 中是否有任何其他方法可以使重建表的插入历史变得不可能?
最佳答案
也许你可以使用类似 dblink
的东西或 postgres_fdw
使用远程连接(到当前数据库或另一个数据库)写入表,从而分离 xmin
值,即使您作为用户认为您是在“同一事务”中完成所有操作。 "
关于通过逆向工程顺序 xmin 值进行跟踪的担忧,由于 dblink 是异步的,当许多用户同时向系统添加评论时,这个问题可能会在规模上变得没有实际意义。如果您需要在遇到错误后回滚,这可能行不通 — 这实际上取决于将操作限制在一个事务中的重要性。
关于database - Postgres : How to clear transaction ID for anonymity and data reduction,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58758713/