我正在postgresql中实现一个数据库系统,以支持快速查询用户的时间序列数据。事件是例如:用户U在时间T执行动作A.不同的事件类型被分成不同的表,目前大约20个。由于当前事件的数量大约为20M并且很快将达到1B,我决定创建聚合表。聚合是例如:在特定日期执行了至少一个操作的用户数,或每天执行的操作总数。
我创建了插入触发器,只要将一行插入到事件表中,就会将数据插入到聚合表中。这种方法效果很好,并且在当前的事件数量方面提供了出色的性能,我认为它应该可以很好地扩展到。
但是,如果我想创建一个新的聚合,那么只会聚合来自该点的事件。要包含所有旧事件,必须重新插入它们。我认为有两种方法可以实现。第一个是创建一个“重新运行”功能,基本上执行以下操作:
这提出了一些关于原子性的问题。如果在复制后插入事件怎么办?是否应该锁定此操作期间涉及的所有表?
另一个解决方案是为每个聚合表跟踪已聚合的事件表中的哪些行,然后在某个时刻聚合该轨道表中缺少的所有事件。这似乎不太容易出现并发错误,但需要大量的跟踪存储。
是否有其他解决方案,如果没有,您会选择上述哪一种?