使用可刷新materialized view
不使用可刷新materialized view 的自定义排序键
选择对于给定行保持不变的排序键列
tenant_id, id) 作为排序键是一个不错的选择。这些列可以唯一标识每一行,并且即使其他列发生变化,某个 id 对应的 tenant_id 也保持不变。由于按 id 去重与按 (tenant_id, id) 去重是一致的,因此这有助于避免在 tenant_id 发生变化时可能出现的数据去重问题。
将 Postgres 表的副本标识设置为自定义排序键
REPLICA IDENTITY,使其包含排序键列。这对于准确处理 DELETE 至关重要。
如果 REPLICA IDENTITY 不包含排序键列,Postgres CDC 将无法捕获主键以外其他列的值——这是 Postgres 逻辑解码的一项限制。这样一来,Postgres 中除主键外的所有排序键列都会是 NULL。这会影响去重,也就是说,某一行的旧版本可能无法与最新的已删除版本 (其中 _peerdb_is_deleted 设置为 1) 进行去重。
在上面使用 owneruserid 和 id 的示例中,如果主键还不包含 owneruserid,则需要在 (owneruserid, id) 上创建一个 UNIQUE INDEX,并将其设置为该表的 REPLICA IDENTITY。这样可以确保 Postgres CDC 捕获到实现准确复制和去重所需的列值。
下面是如何在 events 表上执行此操作的示例。请务必将此设置应用到所有修改了排序键的表。