Django:存储数据库读数的计算结果

时间:2014-04-28 18:25:46

标签: python django

我正在编写一个应用程序来控制不同水表中的耗水量。简化它,我可以得到每15分钟每个米的消耗读数列表。我有一个返回类似的查询:

Date             | ReadingPoint | Consumption
-----------------+--------------+------------
03/05/2014 02:00 | 1            | 12
03/05/2014 02:00 | 2            | 12
03/05/2014 02:15 | 1            | 7
03/05/2014 02:15 | 2            | 7
03/05/2014 02:30 | 1            | 11
03/05/2014 02:30 | 2            | 11
03/05/2014 02:45 | 1            | 23
03/05/2014 02:45 | 2            | 23
....

我需要在这些读数上定期存储一些预计算。一些例子:

  • 存储每天的总消耗量
  • 存储每天的最大读数
  • 存储月平均消费量

此计算是用户定义的,因此我不确定如何对此进行建模。这个预先计算的表将被密集查询,所以我认为理想的方法是将每个计算存储在不同的表中,但我不确定django是否可以进行这种动态模型创建。

所以这是我的问题:

  • 我确定有工具可以做这类事情,但我以前从未需要这样做,而且我想避免数天或数周的研究和测试。有没有"标准"如何实现这种行为?

  • 为了启动进行预先计算的过程,我正在考虑使用Celery。这是一个正确的选择吗?

2 个答案:

答案 0 :(得分:1)

一个通用计算表怎么样?

computation_id         | key                       | value
-----------------------+---------------------------+---------
monthly_average        | "reading_point_id+month"  | 1.2
weekly_maximum         | "reading_point_id+week"   | 9
monthly_global_maximum | "month"                   | 12

密钥格式将与用户定义的计算一起定义。 calculate_id和identifier将是您的复合主键。 calculate_id可以是一个数字字段(这将为您提供更快的索引查找)。

我怀疑表现会很好,尽管只有一张大桌子。

我希望我不会误解你的要求。

答案 1 :(得分:0)

您是否考虑使用Redis或Memcached等简单的键值缓存系统?您可以将所有值存储在缓存中的值中。如果您需要重新计算,则可以重建缓存。但除此之外,如果你想要的只是值和快速查找,缓存就可以正常工作。在不知道您的查询会是什么样子的情况下,建议对数据库表进行任何优化可能为时过早。

如果缓存对您来说太早,您还可以编写自己的ModelManager方法来动态计算和存储值。

class WaterMeterManager(models.Manager):
  def pre_calculate(self):
    return self.get_query_set().aggregate(Avg('value'), Max('value'), Min('value'), Sum('value'))

class WaterMeter(models.Model):
    objects = WaterMeterManager()

您可以将其用作:

WaterMeter.objects.pre_calculate().get('value__min')