我计划将我的第一个数据加载到GAE中,并且真的想把事情弄清楚。我使用的语言是Python。我的问题是关于在应用引擎中存储只读时态数据的存储。
我有一个电子表格,大约有50k行乘以30列。
这是历史数据,表将是只读的。
我设想了很多按星期排序(显示我在七月的周末等等)和时间(不一定总是与日期-但有时与),所以我最初的想法是创建一个额外的行,并填入之前计算的"星期"。
eg.
date, time, dayofweek, event, geolocation, etc
27-02-2009, 08:20:00, 'Friday' ...
上面显示的日期和时间反映了它是如何从电子表格ATM来的。
如果我要去计算"星期几"的麻烦,我认为这是一个好主意,考虑到您对GAE的数据存储模型的经验,我应该:
-只有一个日期时间?(并让GAE在将来排序/请求时计算出星期几?)-创建一个星期,但有一个单一的日期?"2009-02-27 08:10:00"-将星期几存储为整数?(0 = Python IIRC中的星期一)-商店日期改为"2009-02-27"?
输出将始终是英文,也可能是JSON。这是一个数据可视化研究,一些额外的时间动画可以在客户端上完成-但我主要关心的是保持在GAE中完成的工作,我承认这可能只是一个年轻的恋物癖。
如果您计划基于星期进行查询——也就是说,您需要选择几个星期五,而不是相邻的日子——您绝对应该将其拆分为一个单独的属性,因为这将使对它进行有效的查询成为可能。
要执行查询'Fridays in July',如您所建议的,您有几个选项:
- 如果没有单独的"星期"属性,你可以为每个有效的日子做四到五个查询
- 使用单独的'day of week'属性,您可以对星期和日期范围进行单个查询。这将对日期范围使用你的不等式过滤器,所以你不能在查询中的任何其他属性上也做不等式过滤器。
- 使用单独的"星期几"one_answers"月"属性,您可以在不使用任何不等式过滤器的情况下执行上述查询。
应该只有一个日期时间。这将允许您的系统在将来需要时被其他系统使用。我还认为,可计算的项目不应该存储在数据库中,因为一些计算的参数会随着时间的推移而变化。
HTH,
如果想要获得最佳性能,可以在键名中添加年数和日期。例如,我所做的是像这样构造键:解析:124:2011
那么我们很容易拿到最后30天的有效期。只需创建一个列表生成器,它将创建最近30天的密钥列表
from datetime import datetime
dof = datetime.now().timetuple()
keys = [db.Key.from_path("Analytic","%i:%i"%(dof-i,2011)) for in in xrange(0,30)]
analytics = db.get(keys)
我同意你一定想用对查询有意义的方式来分解你的日期。将一些信息构建到键中也可以如建议的那样有用。但这并不总是可能的。例如,可能存在对密钥的竞争性关注。另一种选择是仅基于日期和使用祖先/父关系构建查询索引。然后,您可以对面向日期的实体执行仅键查询,并使用它们来获取父节点。
最后一点,我建议无论您如何分解日期,都要完整地存储日期时间。如果有什么错误或者你改变了你的计划,你以后可能需要他。