复制数据与 Google App Engine 上的多次搜索 - 设计决策

Posted

技术标签:

【中文标题】复制数据与 Google App Engine 上的多次搜索 - 设计决策【英文标题】:Replicated data vs. Multiple searches on Google App Engine - Design decision 【发布时间】:2011-10-06 09:28:18 【问题描述】:

我总是在使用 Google App Engine 时遇到这个问题:我应该重复存储在其他实体中的数据还是应该进行关联?我应该分析什么来做出这个决定?

我不会在搜索中使用这些信息,所以这不是“GAE 加入问题”,而是 co$t 的问题。

现在,我有这样一个坚固的例子:

public class GameResult

    private int points;
    private int duration;
    ...


public class Player

    private string name;
    private GameResult lastGameResult;

    List<int> lastGamesPoints;

不知何故,我需要知道最近 5 场比赛的标点符号,这是我唯一需要的信息,也就是说,我不需要知道过去比赛的 GameResult 的其他内容。我可以拥有这个整数列表,或者我可以拥有 GameResults 的 OneToMany 关联。

【问题讨论】:

【参考方案1】:

这真的取决于你的实际使用情况和瓶颈。 如果您不需要修改这些数据,将它们复制到不同的实体将是一个好主意。特别是当您需要获取这些“最后五个结果”时(使用 order_by 的查询)。如果您使用一对多关系模型,这意味着您需要花费一些 CPU 小时来首先索引它们。然后,您需要在查询这些结果时支付额外的 CPU 时间。我不认为这是一个好主意。另一种方法是使用 ListProperty 来存储最后五个 GameResult 实体。这意味着您可以使用它们的键检索这些实体,这将比查询更快。

欲了解更多信息,请阅读一些很棒的帖子! Relational vs Non-Relational Data Modeling - what's the difference & How to think in data stores instead of databases?

【讨论】:

非常感谢。我不需要修改这些数据。我的例子令人不快:如果我告诉您我不想为结果编制索引(order_by),您会更改答案中的任何内容吗?看,在我的真实应用程序中,我有一个不经常使用的与 GameResult 的 OneToMany 关联。但我也有一个 OneToMany 关联,它与 GameResult(点)中的一个属性一直在使用。我在这里复制数据,所以我不需要一直获取 GameResults 列表。我现在将检查 ListProperty 和链接。 根据您的解释,由于您不需要修改这些数据,而且您一直需要最后五个分数,我建议您将分数直接存储在 Player 实体中!

以上是关于复制数据与 Google App Engine 上的多次搜索 - 设计决策的主要内容,如果未能解决你的问题,请参考以下文章

连接到 Google App Engine 数据存储

Google App Engine 和 Cloud SQL:在“读取初始通信数据包”时失去与 MySQL 服务器的连接

Google App Engine 通过内部网络与 Compute Engine 通信

Google App Engine 上的 JDO 与 JPA for Java

如何在Google App Engine上防止“ImportError:没有名为oauth2client.client的模块”?

GWT与Google App Engine-上传文件