Database NxN数据聚合的数据存储设计

Database NxN数据聚合的数据存储设计,database,database-design,architecture,scale,aggregation,Database,Database Design,Architecture,Scale,Aggregation,我试图为数据聚合和存储的NxN问题提出一个理论解决方案。作为一个例子,我有大量的数据通过流传入。流以点的形式发送数据。每个点有5个维度: 位置 日期 时间 名字 统计数字 然后需要对这些数据进行聚合和存储,以允许另一个用户来查询数据的位置和时间。用户应该能够进行如下查询(伪代码): 显示2011年1月1日至2011年3月1日上午11点至下午4点之间位置1,2,3,4,….N的汇总统计信息 不幸的是,由于数据的规模,不可能实时聚合所有这些数据,因此需要在此之前进行聚合。正如您所看到的,数据可以在多

我试图为数据聚合和存储的NxN问题提出一个理论解决方案。作为一个例子,我有大量的数据通过流传入。流以点的形式发送数据。每个点有5个维度:

  • 位置
  • 日期
  • 时间
  • 名字
  • 统计数字
  • 然后需要对这些数据进行聚合和存储,以允许另一个用户来查询数据的位置和时间。用户应该能够进行如下查询(伪代码):

    显示2011年1月1日至2011年3月1日上午11点至下午4点之间位置1,2,3,4,….N的汇总统计信息

    不幸的是,由于数据的规模,不可能实时聚合所有这些数据,因此需要在此之前进行聚合。正如您所看到的,数据可以在多个维度上聚合

    他们可以查询任意天数或位置,因此查找所有组合需要大量的预聚合:

    • 今日第1个地点的记录
    • 今日第1,2个地点的记录
    • 今日第1,3个地点的记录
    • 今天位置1、2、3的记录
    • 等等。。。高达
    在查询之前预处理所有这些组合可能会导致大量不可行的处理。如果我们有200个不同的位置,那么我们有2^200个组合,这几乎不可能在任何合理的时间内进行预计算

    我确实考虑过在一维上创建记录,然后在需要时可以动态地进行合并,但这也需要一定的时间

    问题:

  • 鉴于用户很可能会查询所有维度,我应该如何选择正确的维度和/或维度组合
  • 有没有我可以参考的案例研究,我可以读的书,或者你能想到的任何有帮助的东西
  • 谢谢你抽出时间

    编辑1

    当我说将数据聚合在一起时,我的意思是将其他维度的统计数据和名称(维度4和维度5)结合起来。因此,例如,如果我请求位置1,2,3,4..N的数据,那么我必须在将其提供给用户之前,将这些位置的统计信息和名称计数合并在一起

    同样,如果我要求提供日期为2015年1月1日至2015年12月1日的数据,则我必须汇总这些期间的所有数据(通过添加汇总名称/统计数据)

    最后,如果我要求在2015年1月1日至2015年12月1日之间提供位置1、2、3、4..N的数据,那么我必须汇总所有位置在这些日期之间的所有数据


    在本例中,让我们假设遍历统计信息需要某种嵌套循环,并且不能很好地扩展,尤其是在运行时。

    您有很多数据。由于您试图解析的数据量很大,因此所有方法都需要花费大量时间。 我有两种方法。 第一个是残酷的,你可能会想:

    id | location | date | time | name | statistics
    0  | blablabl | blab | blbl | blab | blablablab
    1  | blablabl | blab | blbl | blab | blablablab
    ect.
    
    有了这个,您可以轻松地解析和获取元素,它们都在同一个表中,但是解析很长,表很大

    第二个更好,我认为:

    Multiple tables:
    id | location
    0  | blablabl
    
    id | date
    0  | blab
    
    id | time
    0  | blab
    
    id | name
    0  | blab
    
    id | statistics
    0  | blablablab
    
    有了这个,你可以更快地解析,获得ID,然后获取所有需要的信息。 它还允许您准备所有数据: 您可以将位置按位置排序,时间按时间排序,名称按字母表排序,等等,因为我们不关心ID的混合方式: 如果id是1 2 3或1 3 2,实际上没有人关心,如果您的数据已经在各自的表中进行了解析,那么解析速度会快得多

    因此,如果使用我给出的第二种方法:在接收到一个数据点时,为他的每个列提供一个ID:

    You receive:
    London 12/12/12 02:23:32 donut verygoodstatsblablabla
    You add the ID to each part of this and go parse them in their respective columns:
    42 | London ==> goes with London location in the location table
    42 | 12/12/12 ==> goes with 12/12/12 dates in the date table
    42 | ...
    
    有了这个,你想要得到所有的伦敦数据,它们是并排的,你只需要得到所有的ID,然后得到其他的数据。如果您想获取11/11/11和12/12/12之间的所有数据,它们都是并排的,您只需获取ID等

    希望我能帮忙,抱歉我的英语不好。

    试试时间序列数据库! 根据您的描述,您的数据似乎是一个时间序列数据集。 用户似乎最关心查询时的时间,在选择时间范围后,用户将通过附加条件来优化结果

    考虑到这一点,我建议您尝试使用时间序列数据库。 例如,Influx提供了一种能够处理如下查询的查询语言,它非常接近您要实现的目标:

    从事件中选择计数(位置)
    其中时间>'2013-08-12 22:32:01.232'和时间<'2013-08-13'
    按时间分组(10m);
    
    我不知道你所说的规模是什么意思,但时间序列DBs的设计是为了快速处理大量数据点。
    我建议在推出自己的解决方案之前,一定要尝试一下

    您应该查看ApacheFlume和Hadoop


    flume代理可用于捕获数据并将其聚合到HDF中,您可以根据需要进行扩展。在HDFS中,有许多选项可以可视化,甚至可以使用map reduce或elastic search查看您在提供的示例中查找的数据集

    我曾使用过一个销售点数据库,该数据库包含十万种产品和一万家店铺(通常为周级累计销售,但也包括用于购物篮分析、交叉销售等的收据级数据)。我建议您看看这些:

    • ,高度可扩展,入门相对简单,经济高效
    • ,压缩数据并具有熟悉的SQL接口,非常昂贵(AWS的1年保留实例r3.2xlarge约为37.000美元),没有在集群内扩展的经验
    • 这是我个人的fa