在 App Engine ndb 中构建数据并加快查询速度

Structure data in app engine ndb and speed up query

我正在寻求一些帮助,以了解使用 python 在 App Engine ndb 中构建数据的最佳方式,处理它并稍后查询它。我想以每小时为间隔存储不同地理区域的温度数据。

我可以想到两个实体选项,但也许还有更好的选择。第一种是将每小时温度存储在各个属性中:

class TempData(ndb.Model):
    region = ndb.StringProperty()
    date = ndb.DateProperty()
    00:00 = ndb.FloatProperty()
    01:00 = ndb.FloatProperty()
    ...
    23:00 = ndb.FloatProperty()

或者我可以存储数据

class TempData(ndb.Model):
    region = ndb.StringProperty()
    date = ndb.DateProperty()
    time = ndb.TimeProperty()
    temp = ndb.FloatProperty()

(将日期和时间存储为一个 属性 可能更好?)

我希望能够查询数据存储以计算任何给定日期范围内的总温度、最高温度、最低温度和平均温度。在第一个选项中,我可能会创建 4 个以上的属性来有效地预处理和存储每天的总计、最大值等,所以如果我想查询一年的总温度,我只需要对 365 个值求和,而不是 8760 ?我不确定如何在第二个选项中执行此操作?

我对 App Engine 和数据存储还比较陌生,我认为我仍在考虑关系数据库,因此非常感谢任何帮助。稍后可能需要在不同时区存储数据。

谢谢

保罗

就我个人而言,我会采用第一种方法的变体:

class TempData(ndb.Model):
    region = ndb.StringProperty()
    date = ndb.DateProperty()
    temp = ndb.FloatProperty(repeated=True)

使用 temp 列表按小时顺序存储温度,以便您了解它们。我不认为每个日期的预处理会增加任何东西:要计算一年的任何内容,您仍然需要获取 365 个实体,而延迟将淹没总结一些所需的少量时间千个数字。

一般来说,如果您想通过这种处理创建的新字段方便地进行查询(例如快速回答问题 "which dates in locale X had average temperatures greater than 20 Celsius"),预处理很有用。这似乎不是您的用例。

如果有的话,如果您经常需要计算多个月的值,则进行预处理以按月聚合事物(成为更简单的 TempDataMonth 实体)可能更有用。或者,您当然可以选择任何其他您认为有用的几天时间(几周、十天组等)。这些可以在后台任务中计算,定期检查自上次检查以来哪些时间段已经完成。但是,这有点超出你的问题范围,所以我不会深入细节。

总体思路是,尽量减少要获取的实体数量往往是最重要的优化;其他优化当然也是可能的,但是,它们往往仅次于 fiddle:-).