2014-04-28 51 views
0

我正在編寫一個應用程序來控制不同水錶中的耗水量。簡化它,我可以每15分鐘獲得每個電錶消耗量的讀數列表。我有一個查詢返回如下內容:Django:在數據庫讀數中存儲計算結果

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是否可以執行這種動態模型創建。

因此,這裏是我的問題:

  • 我敢肯定有工具做這樣的事情,但我從來沒有需要之前做到這一點,我想避免天或數週的研究和測試。是否有任何「標準」的方式來實現這種行爲?

  • 對於啓動進行預計算的過程,我正在考慮使用芹菜。這是一個正確的選擇嗎?

回答

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可以是一個數字字段(這會給你更快的索引查找)。

我懷疑表現會相當不錯,儘管有一張大桌子。

我希望我不會誤解你的要求。

+0

謝謝!我喜歡這種方法,雖然計算出的ID可能是一個生成/解碼的痛苦。在接受你的答案之前讓我測試它。 –

0

您是否考慮過使用像Redis或Memcached這樣簡單的Key-Value緩存系統?您可以將所有值快速存儲在緩存中的值中。如果你需要重新計算,你可以重建緩存。但除此之外,如果你想要的只是數值和快速查找,緩存將會工作得很好。不知道你的查詢會是什麼樣子,建議對數據庫表進行任何優化可能爲時過早。

如果緩存對您來說還爲時過早,您還可以編寫自己的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') 
+0

任何重建緩存的簡單方法? – Sayok88

相關問題