Postgres:如何清除交易ID以减少匿名和减少数据

我们正在运行一个评估平台,用户可以在其中评论某些事情。一个关键功能是人们只能评论一次,并且每个评论都是匿名的。

我们将Postgres用于所有数据。我们想在用户创建评论的数据库中保存一个标志(因此他们不能再次发表评论)。在一个单独的表中但在同一事务中,我们希望保存注释本身而不与用户建立任何链接。

但是,postgres会保存插入数据库(system columns中的xmin)的每个元组的事务ID。因此,我们必须避免用户和他们的评论之间存在链接!

可能的(非)解决方案

  • 仅进行抽真空无济于事,因为它无法清除事务ID。请参阅“ 24.1.5。防止事务ID环绕失败”一节in the postgres docs中的“注释”框。

  • 将这些插入内容放入不同的事务中并不能解决任何问题,因为事务ID是连续的。

  • 我们可以将多个用户的评论聚集到带有一些分隔符的数据库中的一个大文本上,但是由于这种大文本的旧版本将至少由postgres保留,直到下一次真空,这似乎并不像完整的解决方案。此外,我们仍然可以按照用户添加评论的顺序排列,这样很好,也可以不保存。

  • 定期重写这些表中的所有元组(通过对所有表元进行虚拟UPDATE),然后进行清除操作可能会充分擦除“插入历史记录”,但这似乎也很粗糙。

postgres中是否还有其他方法无法重建表的插入历史记录?

alarate 回答:Postgres:如何清除交易ID以减少匿名和减少数据

也许您可以使用dblinkpostgres_fdw之类的东西通过远程连接(到当前数据库或另一个数据库)写入表,从而分隔xmin值,甚至尽管您作为用户认为自己是在“同一笔交易”中完成所有操作的。

关于通过反向工程化顺序xmin值进行跟踪的问题,由于dblink是异步的,因此当许多用户同时向系统中添加注释时,此问题可能会逐渐解决。如果您在遇到错误后需要能够回滚,这可能不起作用-这实际上取决于将操作限制为一个事务对您来说有多重要。

,

我认为没有问题。

在您的评论中,您写道您与用户保持一个标志(但实际上存储了它),以跟踪用户发表评论的帖子。要使该信息保密,您必须将该标志保密,以便用户以外的任何人都无法读取它。

如果没有其他用户可以看到该信息,则其他用户也看不到相应表条目上的xmin。然后没有人可以与评论上的xmin进行关联,因此问题就不存在了。

困难的部分是您希望如何保密发布用户评论的信息。我看到两种方式:

  1. 不要使用数据库技术来执行此操作,而是编写应用程序以使其对用户隐藏该信息。

  2. 使用PostgreSQL行级安全性来做到这一点。

您无法保留超级用户的信息。甚至不要尝试。

,

您可以将用户及其标志和注释存储在不同的数据库群集上(并使用分布式事务),这样xmin就会不相关。

确保禁用track_commit_timestamp

要使关联数据库中的交易成为不可能,您可以随机发出

SELECT txid_current();

除了增加事务计数器外什么都不做。

本文链接:https://www.f2er.com/3140939.html

大家都在问