我们有这样一个场景:
- 数百万条记录(记录 1、记录 2、记录 3...)
- 划分为数百万个不相交的小组(A 组、B 组、C 组...)
- 成员资格会随着时间逐渐改变,即一条记录可能会重新分配给另一个组。
我们正在重新设计数据模式,我们需要支持的一个用例是给定一条特定记录,查找在给定时间点属于同一组的所有其他记录。或者,这可以被认为是两个单独的查询,例如:
- 三年前,记录 15544 属于哪个组?(将此组称为 g)。
- 三年前,哪些记录属于g组?
假设我们使用关系数据库,记录和组之间的关联很容易使用记录 id 和组 id 的两列表来建模。允许历史查询的常用方法是添加时间戳列。这使我们可以如下回答上述问题:
- 查找记录 15544 的行,该行具有给定日期之前的最新时间戳。这告诉我们 Group g。
- 查找在任何时候都属于组g的所有记录。
- 对于这些记录中的每一个,找到在给定日期之前具有最新时间戳的行。如果这表明该记录当时在组g中,则将其添加到结果集中。
这还不错(假设该表由记录 id 和组 id 分别索引),甚至可能是刚刚描述的朴素表结构的最佳算法,但它确实需要对步骤 2 中找到的每条记录进行索引查找.是否有可以更有效地回答查询的替代数据结构?
ETA:这只是系统的几个用例之一,所以我们不希望以降低对当前分组的查询为代价来加速这个查询,也不希望在空间消耗等方面付出巨大的代价.