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