有效地组织大型数据集以进行报告

时间:2013-02-17 09:04:10

标签: database-design data-structures nosql bigdata

所以数据层次结构非常简单:

Account >> SubAccount >> Category >> Product

我需要为每个产品提取每日统计信息(这只是一个数字,我们称之为每日性能)。可以有数十个帐户,数十个子帐户,数百个类别以及 百万 的产品。

允许我这样做的API的格式为

GetCurrentPerformance(Product)

现在,在基于网络的信息中心中,我需要能够显示任何产品,类别,子帐户和帐户的时间与性能。如果任何产品的性能自上次提取GetCurrentPerformance(Product)以来急剧变化(例如超过30%),我还需要能够发出警报。

我正在云上构建此解决方案,最好是在AWS上。我正在尝试决定如何最好地存储我每日提取的数据。这是我考虑过的:

  1. 将所有内容放入数据库(RDBMS)。关注桌子大小的快速增长速度。
  2. 维护每个产品的平面文件,将日期的性能添加到此文件中。在获取(平均)时计算类别,子帐户和帐户的统计信息,并按类别,子帐户和帐户维护文件。 关注:文件需要存储在S3上,S3不支持追加。使整个pull-file,append-data,push-file非常耗时。
  3. 为每天的数据维护一个文件(跨所有产品)。然后在批处理作业中,计算每个产品,类别,子帐户和帐户的统计信息。维护文件/数据库,以便不必为平均计算引用所有文件。 关注:要显示特定产品的时间表,需要阅读数百个文件。
  4. No-SQL数据库?对此没有任何经验。
  5. 这似乎是一个非常简单的问题 - 但我对最佳的进行方式感到困惑。建议表示赞赏。

1 个答案:

答案 0 :(得分:0)

如果您只关心当前与以前的性能并且不需要任何历史性能统计信息,那么以下内容在RDBMS中可以正常工作:

create table product_performance (
  product_id integer primary key,
  current_perf number,
  previous_perf number
);

然后,您可以通过执行以下内容来设置性能:

update product_performance
set    current_perf = :new_perf,
       previous_perf = current_pref
where  product_id = :product;

如果你想保持自然的表现(所以你可以追踪随时间的变化),你需要这样的东西:

create table product_performance (
  product_id integer,
  performance_date date,
  performance number,
  is_current char(1), --optional, may improve the performance of finding current perf easier
  primary key (product_id, performance_date)
);

每个新的效果值只是产品和日期的插入。

无论使用哪种方法,最好在设置新性能时发出警报,而不是等待重新运行仪表板获取查询。