Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
轨道4+;PostgreSQL(Heroku):用于数据分析/报告的复杂/可扩展查询_Postgresql_Ruby On Rails 4_Schema_Reporting - Fatal编程技术网

轨道4+;PostgreSQL(Heroku):用于数据分析/报告的复杂/可扩展查询

轨道4+;PostgreSQL(Heroku):用于数据分析/报告的复杂/可扩展查询,postgresql,ruby-on-rails-4,schema,reporting,Postgresql,Ruby On Rails 4,Schema,Reporting,正在开发跟踪销售的财务应用程序。但是,我在尝试创建一个模式来正确跟踪报表数据时遇到了问题(应用程序的要点) < A>代码>购买< /代码>是应用程序的基础。它有几个关联(如下所列)。每个购买都通过年和月字段进行跟踪。一年是用户过滤报表的最小单位,因此我只需显示该年每个月的数据 # purchase.rb model class Purchase < ActiveRecord::Base # Associations: # belongs_to :partner # belong

正在开发跟踪销售的财务应用程序。但是,我在尝试创建一个模式来正确跟踪报表数据时遇到了问题(应用程序的要点)

< A>代码>购买< /代码>是应用程序的基础。它有几个关联(如下所列)。每个
购买
都通过年和月字段进行跟踪。一年是用户过滤报表的最小单位,因此我只需显示该年每个月的数据

# purchase.rb model
class Purchase < ActiveRecord::Base
  # Associations:
  # belongs_to :partner
  # belongs_to :purchase_type
  # belongs_to :purchase_category

  # Attributes:
  # partner_id           => association
  # purchase_type_id     => association
  # purchase_category_id => association
  # year                 => year in integer (2013, 2014, etc...)
  # month                => month in integer ("January" => 1, etc...)
  # amount               => amount a product sold for in cents ($10.00 => 1000)
  # fee                  => fee for associated partner (if there is one) in cents ($2.00 => 200)
end
#purchase.rb模型
类购买关联
#采购\类型\ id=>关联
#采购\类别\ id=>关联
#年份=>整数年份(2013年、2014年等)
#月份=>整数形式的月份(“一月”=>1等)
#金额=>以美分为单位的产品销售金额($10.00=>1000)
#费用=>关联合伙人(如果有)的费用,单位为美分($2.00=>200)
终止
问题是,我需要展示一个给定年份的概览,根据完成的购买数量、合作伙伴完成的购买数量以及费用金额进行细分。我通过使用
YearMetric
MonthMetric
表解决了这个问题,这些表在每次添加/更新/删除采购时都会更新。因此,您为给定的年/月添加了新的购买,相应的
YearMetric
MonthMetric
行将被找到,并使用+/-适当的金额/费用进行更新

此解决方案适用于概览页面。但是,我还需要能够在合作伙伴、采购类型和采购类别的上下文中查看采购。如果我遵循与我的概览报告相同的策略,我将不得不添加以下表格:

  • PartnerYearMetric,PartnerMonthMetric
  • PurchaseCategoryEarmetric,PurchaseCategoryMonthMetric
  • PurchaseTypeYearMetric,PurchaseTypeMonthMetric
因此,每次我添加一个购买,我将做多达8个额外的数据库更新(8个查找,然后8个更新)

我报告的项目包括总购买量、平均购买量(历史比较)、该期间的总金额/费用、按购买数量和大部分费用金额排列的顶级合作伙伴等


必须有比这更好的解决办法。通过每购买一次更新8条记录进行“实时计算”似乎有点过分。

您所做的是在应用程序中维护数据的物化视图。这是非规范化的一种形式。这可以作为一个优化,但不应该是你的第一选择。它可能非常容易出错,尤其是在存在并发的情况下,必须非常小心地执行

相反,当您希望生成摘要报告时,请使用聚合来对它们进行
SUM
COUNT
等。见

您可能会发现在所使用的查询上创建一个
视图
,然后从应用程序访问该视图非常方便

如果您发现实时计算汇总的性能存在问题,并且无法通过适当的索引和调整来解决,那么您应该考虑去规范化。不过,不要在应用程序中维护实体化视图,而是考虑在数据库中使用触发器;它们更容易以并发安全的方式编写


您可能还想查看PostgreSQL 9.4的增强物化视图支持。

关于DB触发器和视图的好建议。我习惯于与一位Oracle DBA一起工作,他能解决这些问题,但在这个应用程序上,我自己做DB工作。因此,我一直回避DB解决方案。我主要担心的是,用户将在给定的会话中查看5-10个报告,每个报告将在所有帐户数据中进行大约20 DB的查询,以获取报告的统计数据。对于1000个并发用户,这似乎会导致页面加载速度变慢。我的目标是在1秒或更短的时间内加载每个报告页面。你认为这样扩展PG可行吗?@DanL取决于硬件以及DB是否适合RAM。听起来它可能是物化视图的候选对象,很可能触发维护视图,但如果您对并发性非常小心,也可以在应用程序中实现。