gim*_*mg1 5 database architecture database-design scale aggregation
我正在尝试为数据聚合和存储的NxN问题提出理论解决方案.作为一个例子,我有大量的数据通过流进入.流以点为单位发送数据.每个点有5个维度:
- 地点
- 日期
- 时间
- 名称
- 统计
然后需要聚合和存储该数据以允许另一个用户来查询位置和时间的数据.用户应该能够像下面这样查询(伪代码):
显示位于时间上午11点到下午4点之间的日期01/01/2011和01/03/2011之间位置1,2,3,4,.... N的汇总统计数据
不幸的是,由于数据的规模,不可能从动态点汇总所有这些数据,因此需要在此之前进行聚合.正如您所看到的,虽然有多个维度可以聚合数据.
他们可以查询任意天数或位置,因此找到所有组合将需要大量的预聚合:
- 记录地点1今天
- 记录地点1,2今天
- 记录地点1,3今天
- 记录地点1,2,3今天
- 等等......直到N.
在查询之前预处理所有这些组合可能导致一定数量的不可行的进动.如果我们有200个不同的位置,那么我们有2 ^ 200个组合,这几乎不可能在任何合理的时间内预先计算.
我确实考虑过在1维上创建记录,然后在请求时可以动态进行合并,但这也需要大量的时间.
问题:
感谢您的时间.
编辑1
当我说汇总数据时,我的意思是将统计数据和名称(维度4和5)结合起来用于其他维度.因此,例如,如果我为位置1,2,3,4..N请求数据,那么在将其提供给用户之前,我必须将这些N个位置的统计数据和名称计数合并在一起.
同样,如果我请求日期01/01/2015 - 01/12/2015的数据,那么我必须在这些期间之间汇总所有数据(通过添加汇总名称/统计数据).
最后,如果我要求日期01/01/2015 - 01/12/2015之间的位置1,2,3,4..N,那么我必须汇总这些日期之间所有这些位置的所有数据.
为了这个例子,我们可以说通过统计数据需要某种嵌套循环,并且不能很好地扩展.
非规范化是解决关系数据库性能或可扩展性的一种方法。
IMO 拥有一些新表来保存汇总数据并使用它们进行报告将对您有所帮助。
我有大量通过流传入的数据。流以点为单位发送数据。
这种情况下会有多种方式实现非规范化:
在理想情况下,当消息达到流级别时,将有两份包含location, date, time, name, statistics维度的数据消息副本被分派进行处理,一份用于OLTP(当前应用程序逻辑),第二份将用于OLAP (BI) 流程。
BI 流程将为报告创建非规范化聚合结构。
我建议对每个位置、日期组进行聚合数据记录。
因此,最终用户将查询不需要大量重新计算的预处理数据,具有一些可接受的不准确性。
鉴于用户可能对所有维度进行查询,我应该如何选择正确的维度和/或维度组合?
这取决于您的应用程序逻辑。如果可能,限制用户进行可由用户分配值的预定义查询(例如从 01/01/2015 到 01/12/2015 的日期)。在更复杂的系统中,可以选择在 BI 仓库之上使用报告生成器。
我推荐Kimball 的数据仓库 ETL 工具包。