【发布时间】:2019-03-20 23:46:41
【问题描述】:
假设我有一个 Transaction 模型:
class Transaction(models.Model):
receiver = models.CharField(unique=True)
value = models.DecimalField(max_digits=10, decimal_places=5)
date = models.DateField()
现在,我有数以万计的事务进入表中。
我需要向收款人展示每天、每周、每月、每年等的交易情况。
我可以使用以下语句来做到这一点:
from django.db.models import Sum
transactions = Transaction.objects.filter(receiver="name").aggregate(Sum('value'))
然后根据我需要的日期时间段进行过滤。示例:
transactions.filter(date__gte=start_date, date__lte=end_date)
这有多快?如果表增长到有数百万个条目会发生什么?如何确保优化? django 是否缓存 Sum 中的值?
我认为如何进行优化的天真的方式是创建更多模型: DayTransaction、MonthTransaction、YearTransaction 等,当我更新 Transaction 模型时,我会更新所有其他模型。
这样,当用户请求数据时,我从“缓存”汇总数据的模型中获取它,它不需要做任何操作,它只是从各个表中检索数据,这很多小于事务一。
这种方法的问题在于,它实际上可能不会更快,不够灵活,如果更新所有模型时出现任何问题,数据可能会变得混乱。
【问题讨论】:
-
数据库应该能够处理数百万个条目。查看stackoverflow.com/questions/2051481/…