将计算值存储在数据存储区中,或者只是在运行中计算它

时间:2012-06-29 22:45:48

标签: python database performance google-app-engine google-cloud-datastore

我在谷歌应用程序引擎的python中编写应用程序,每个用户都可以提交帖子,每个帖子的排名由其投票和评论数决定。排名只是基于这两个参数的简单计算。我想知道我应该将这个值存储在数据存储区中(并在那里占用空间),或者只是在每次需要时计算它。现在只是fyi,帖子将按排名进行排序,以便需要考虑。

我主要考虑的是效率,并尝试平衡,如果我应该尝试保存数据存储空间或保存读/写配额。

我认为简单地存储它会更好但是每次有人在帖子上投票或评论时我都需要重新计算和重写排名值。

任何输入都会很棒。

3 个答案:

答案 0 :(得分:2)

如何将排名存储在帖子中作为属性。这对于查询/排序是不合理的。

如果您在存储投票/评论计数的同时存储排名(意思是相同的权利),那么写入成本的唯一增加将是索引。 (确定初始写入成本,但这是2 [非常小的无论如何])。

每当有人在帖子上投票或评论时你都需要做一个数据库操作吧!?!怎么还能跟踪投票/评论?

实际上,我想你会开始使用文本搜索来查找帖子中的数据。如果是这样,我会考虑将排名存储为搜索索引中的属性,并使用它来对匹配结果进行排名。

我们不需要考虑如何选择要显示的帖子。按投票和评论排名是唯一的标准吗?

答案 1 :(得分:1)

当计算费用昂贵时,缓存最有用。如果计算简单且便宜,您可以根据需要重新计算。

答案 2 :(得分:1)

如果你依赖于在一个实体中保持一个正在运行的投票计数,那么你要么必须愿意失去偶尔的投票,要么你必须使用交易。如果您使用交易,则每秒可以执行的交易数量受到限制。 (参见关于交易和实体组的文档)。如果你有可能获得高票数,速率限制可能是一个问题。

对于较低的投票率,在实体中保留计数可能会正常工作。但是,如果您的投票率有任何显着的高峰,那么存储单独的投票实体会定期累积到缓存计数中,或许可以通过memcache中保存的(可能不可靠的)增量计数进行调整,可能对您更有效。

这实际上取决于您想要优化的内容。如果您试图通过保持非事务性缓存的投票计数来最小化磁盘写入,则可能会失去投票。