我们有这样的场景:
我们正在重新设计数据模式,我们需要支持的一个用例被赋予特定记录,找到在给定时间点属于同一组的所有其他记录。或者,这可以被认为是两个单独的查询,例如:
假设我们使用关系数据库,记录和组之间的关联可以使用记录ID和组ID的两列表轻松建模。允许历史查询的常用方法是添加时间戳列。这使我们能够回答以下问题:
这不是太糟糕(假设表是由记录ID和组ID单独索引的),甚至可能是刚刚描述的朴素表结构的最佳算法,但它确实需要为找到的每个记录进行索引查找在第2步中。是否有替代数据结构可以更有效地回答查询?
ETA:这只是系统的几个用例中的一个,因此我们不希望加快此查询,代价是对当前分组的查询速度较慢,我们也不想要在太空消费等方面付出巨大代价。
答案 0 :(得分:1)
如何创建两个表:
map1
)map2
)每次更改记录:
t <- current time
map1
创建一个新条目:(oldGroupID,t,list')
- 其中list'是相同的列表,但没有您刚从那里移出的条目。map1
:(newGroupId,t,list'')
- 其中list''是新组的旧列表,并添加了更改后的记录。在查询期间:
map2
中找到“最接近”且小于的条目
(recordId,desired_time)
- 这是经典的O(logN)
操作
排序数据结构。g
。(g,desired_time)
的条目。该值是在所需时间在该组中的所有记录的列表。这需要相当多的空间(尽管是常数因素......),但每个操作都是O(logN)
- 其中N
是记录更改的数量。
主要存储在磁盘上的条目的有效排序DS是B+ tree,它也是由许多关系DS实现实现的。