我正在寻求一些帮助,以了解使用 python 在应用程序引擎 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 个值?我不确定在第二个选项中如何执行此操作?
我对应用程序引擎和数据存储区相对较新,我认为我仍在考虑关系数据库,因此任何帮助将不胜感激。稍后可能需要将数据存储在不同的时区。
谢谢
保罗
最佳答案
就我个人而言,我会采用第一种方法的变体:
class TempData(ndb.Model):
region = ndb.StringProperty()
date = ndb.DateProperty()
temp = ndb.FloatProperty(repeated=True)
使用temp
列表按小时存储温度,以便您了解它们。我不认为每个日期的预处理会增加任何东西:要计算一年的任何内容,您仍然需要获取 365 个实体,而延迟将淹没总结一些实体所需的极少量时间。无论如何,有一千个数字。
一般来说,如果您想通过此类处理创建的新字段轻松查询(例如,快速回答“区域设置 X 中哪些日期的平均温度高于 20 摄氏度”的问题),预处理非常有用。这似乎不是您的用例。
如果有的话,如果您经常需要计算多月的值,那么预处理以每月聚合事物(转换为更简单的 TempDataMonth
实体)可能会更有用。或者,当然,您认为有用的任何其他几天时间段(几周,十天一组,等等)。这些可以在后台任务中计算,定期检查自上次检查以来哪些周期已经完成。但是,这有点超出了你的问题范围,所以我不会深入讨论细节。
总体思路是,最大限度地减少要获取的实体数量往往是最重要的优化;其他优化当然也是可能的,但是,它们往往处于次要地位:-)。
关于google-app-engine - App Engine ndb 中的结构化数据并加快查询速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31886726/