决定是在 GCP Bigtable 中使用列版本还是新行
Deciding whether to use column versions or new rows in GCP Bigtable
假设我想在每次用户设置更改时存储他们的快照。这些快照将允许用户查看他们对设置所做更改的历史记录。
每次更改都写入新行(方法 A)还是每次更改都写入同一行(方法 B)更好?
我是否遗漏了任何一种方法的 pros/cons?
以下示例显示用户 (userId123) 进行以下更改:
- 打开通知
- 关闭通知
- 打开通知
方法一:
关键是用户 ID + 时间戳,所以它每次都会写入一个新行。
查询将按行前缀 (userId) 扫描并获取多行以显示历史记录
key
column data
column version
userId123:20220401
{ notifications: true }
1
userId123:20220402
{ notifications: false }
1
userId123:20220403
{ notifications: true }
1
优点:
- 由于每次更改都存储在新行中,因此永远不会达到 256mb 行大小限制
缺点:
- 需要按前缀扫描查询(我假设这比按行键查找慢?)
方法二:
键只是用户 ID,每次创建新列版本时都会写入同一行。
查询将按行键 (userId) 查找并获得具有多个列版本的单行历史记录
key
column data
column version
userId123
{ notifications: true }
1
{ notifications: false }
2
{ notifications: true }
3
优点:
- 可以直接通过行键查找查询(我假设这比通过行前缀扫描更快?)
- 基于版本的垃圾收集可用于仅存储最后 X 个版本
缺点:
- 256mb 行大小限制(除非经常更改,否则似乎不太可能达到此限制)
这种情况更适合将更改与版本一起存储在一行中。您甚至可以设置垃圾收集规则来删除您提到的任何超过一年的更改。
有助于进一步优化此方法的一件事是,如果您在某些情况下只需要最新数据或最近 5 个更改,您可以执行一个查询,该查询将过滤为仅提供 5 个版本并且网络成本安全。
假设我想在每次用户设置更改时存储他们的快照。这些快照将允许用户查看他们对设置所做更改的历史记录。
每次更改都写入新行(方法 A)还是每次更改都写入同一行(方法 B)更好? 我是否遗漏了任何一种方法的 pros/cons?
以下示例显示用户 (userId123) 进行以下更改:
- 打开通知
- 关闭通知
- 打开通知
方法一:
关键是用户 ID + 时间戳,所以它每次都会写入一个新行。
查询将按行前缀 (userId) 扫描并获取多行以显示历史记录
key | column data | column version |
---|---|---|
userId123:20220401 | { notifications: true } |
1 |
userId123:20220402 | { notifications: false } |
1 |
userId123:20220403 | { notifications: true } |
1 |
优点:
- 由于每次更改都存储在新行中,因此永远不会达到 256mb 行大小限制
缺点:
- 需要按前缀扫描查询(我假设这比按行键查找慢?)
方法二:
键只是用户 ID,每次创建新列版本时都会写入同一行。
查询将按行键 (userId) 查找并获得具有多个列版本的单行历史记录
key | column data | column version |
---|---|---|
userId123 | { notifications: true } |
1 |
{ notifications: false } |
2 | |
{ notifications: true } |
3 |
优点:
- 可以直接通过行键查找查询(我假设这比通过行前缀扫描更快?)
- 基于版本的垃圾收集可用于仅存储最后 X 个版本
缺点:
- 256mb 行大小限制(除非经常更改,否则似乎不太可能达到此限制)
这种情况更适合将更改与版本一起存储在一行中。您甚至可以设置垃圾收集规则来删除您提到的任何超过一年的更改。
有助于进一步优化此方法的一件事是,如果您在某些情况下只需要最新数据或最近 5 个更改,您可以执行一个查询,该查询将过滤为仅提供 5 个版本并且网络成本安全。