google-app-engine - App Engine ndb 中的结构化数据并加快查询速度

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

我正在寻求一些帮助,以了解使用 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/

相关文章:

php - 在 Windows 7 上的 Google App Engine PHP SDK 中配置 MySQL 连接

mysql - AppEngine 和 Cloud SQL 连接错误

google-app-engine - 使用 html/template 在 slice 中执行格式化时间

python - 从 google-app-engine ndb 中删除日期时间早于 N 秒的实体

python - 从 NDB 中的 ComputedProperty 函数返回列表的解决方法

python - 获取 admin_only 装饰器的重定向循环

google-app-engine - 使用 JPA 的 Google App Engine 中的百万用户扇出

python - 无法在数据存储区中检索具有生成 ID 的实体

python - 在没有符号链接(symbolic link)的情况下跨服务重用数据存储模型

python - 获取 NDB 查询长度 - 在 Google App Engine 上使用 Python