应用程序开销设计决策:在数据库行上存储所需的值或在queryset中动态查找它

时间:2017-11-14 12:58:22

标签: python django postgresql django-queryset

我正在开发一个简单的价格跟踪器应用程序。我对Web应用程序设计有点新意,可以在这里使用经验丰富的意见。我的应用程序通过独特的产品SKU每天为数十万种产品提供价格点。

对于我希望能够展示的每个SKU:

  • 所有时间价格高
  • 所有时间价格低廉
  • 平均价格

当我的API将新的SKU价格写入数据库时​​,我能够找出这三个值并将它们写入最新/当前价格行。这是一个更好的设计决策,而不是在我的视图中使用Django Queryset来查询和/或计算和显示它们吗?

编辑:

当然,我现在用def get_context_data将它们送到基于Django Class的视图。

context['high_price'] = prices.order_by('price').last()
context['low_price'] = prices.order_by('-price').last()
context['avg_price'] = prices.aggregate(average=Avg('price'))

请注意,我没有使用MIN / MAX汇总,因为我需要每个价格的日期,所以我需要整个价格行(价格模型的结构为'价格日期'和& #39;价格&#39)

原始问题仍然存在。每次我带新价格时,我应该设置这个或写下高/低/平均值吗?以下是我如何做到这一点(例如最高的所有时间价格):

if product.high_price is None or (price.value is not None and price.value >= product.high_price.value):
            product.high_price = price

1 个答案:

答案 0 :(得分:0)

如果您有索引,则使用查询集应该很快。对您所拥有的内容进行基准测试会很有趣,然后在您的模型中添加索引并重复。例如

  price = models.DecimalField(db_index=True)

请参阅https://docs.djangoproject.com/en/1.11/ref/models/fields/#django.db.models.Field.db_index

计算平均值将是缓慢的,并且可能值得拥有一个计算平均值的工作并将其存储在某处。您可以使用celery / redis在后台执行此操作,或者在您提取数据时执行此操作,具体取决于您的设置。