在app引擎ndb中构造数据并加快查询速度

时间:2015-08-07 21:12:37

标签: google-app-engine google-cloud-datastore app-engine-ndb

我正在寻找一些关于使用python在app引擎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 ?我不确定如何在第二个选项中执行此操作?

我对应用引擎和数据存储相对较新,我认为我仍然在考虑关系数据库的问题,所以任何帮助都会受到赞赏。稍后可能需要将数据存储在不同的时区。

由于

保罗

1 个答案:

答案 0 :(得分:4)

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

AsyncState

使用Func<T>列表按小时存储温度,以便了解它们。我不认为每日预处理会增加很多东西:要计算一年中的任何东西,你仍然需要获取365个实体,并且延迟这将淹没总结一些所需的微小时间无论如何,还有一千个号码。

通常,如果您希望通过此类处理创建的新字段轻松查询,则预处理非常有用(例如,快速回答“区域X中的日期温度大于20摄氏度”的问题)。这似乎不是你的用例。

如果有的话,如果您必须计算多月值,那么每月汇总事物(进入更简单的class TempData(ndb.Model): region = ndb.StringProperty() date = ndb.DateProperty() temp = ndb.FloatProperty(repeated=True) 实体)的预处理可能会更有用。或者,您发现有用的任何其他几天时间(当然,周,十天组,无论如何)。这些可以在后台任务中计算,定期检查自上次检查以来哪些时期已经完成。但是,这有点超出了你的问题,所以我没有得到细粒度的细节。

一般的想法是,最小化要获取的实体数量往往是最重要的单一优化;其他优化当然也是可能的,但是,它们往往会成为第二小提琴: - )。