决定是在 GCP Bigtable 中使用列版本还是新行

Deciding whether to use column versions or new rows in GCP Bigtable

假设我想在每次用户设置更改时存储他们的快照。这些快照将允许用户查看他们对设置所做更改的历史记录。

每次更改都写入新行(方法 A)还是每次更改都写入同一行(方法 B)更好? 我是否遗漏了任何一种方法的 pros/cons?

以下示例显示用户 (userId123) 进行以下更改:

  1. 打开通知
  2. 关闭通知
  3. 打开通知

方法一:

关键是用户 ID + 时间戳,所以它每次都会写入一个新行。
查询将按行前缀 (userId) 扫描并获取多行以显示历史记录

key column data column version
userId123:20220401 { notifications: true } 1
userId123:20220402 { notifications: false } 1
userId123:20220403 { notifications: true } 1

优点:

缺点:


方法二:

键只是用户 ID,每次创建新列版本时都会写入同一行。
查询将按行键 (userId) 查找并获得具有多个列版本的单行历史记录

key column data column version
userId123 { notifications: true } 1
{ notifications: false } 2
{ notifications: true } 3

优点:

缺点:

这种情况更适合将更改与版本一起存储在一行中。您甚至可以设置垃圾收集规则来删除您提到的任何超过一年的更改。

有助于进一步优化此方法的一件事是,如果您在某些情况下只需要最新数据或最近 5 个更改,您可以执行一个查询,该查询将过滤为仅提供 5 个版本并且网络成本安全。