Google AppEngine分片问题

问题描述

| 我的背景是相关数据库的知识,我主要通过学习Google AppEngine进行一些实验。我想构建一个“选举”应用,用户属于某个州(加利福尼亚州,纽约州,德克萨斯州等),他们选择一个政党(共和党,民主党等)并为特定年份(2012年)投票现在,但该应用可以在2016年重新使用)。 我希望用户能够看到他们的投票历史记录,并可能在当前选举中对其进行一次更改。另外,我将要求用户指定其邮政编码,并认为按州和/或邮政编码运行某些报告会很好。 使用关系数据库,似乎您将创建一些这样的表:
Users(userid,username,city,state,zip)
UserVote(userid,year,Vote)
然后使用sql运行报告。使用AppEngine数据存储区时,运行汇总报告似乎有些困难。 我最初的想法是将“ 1”分片,其中每个用户可以包含一个“ 2”的列表,然后将聚合总计保存到其他位置。 有什么建议么? 附言我已经看过AppEngine-MapReduce项目,但不确定是否会过分杀伤。     

解决方法

        我不记得我在哪儿读了这篇文章,但是GAE中的List属性达到200个项目后变慢了。我反对这样做,建议使用用户和投票的外键方法。 聚合是一个挑战,因为没有通用的辅助函数,例如MAX,SUM,COUNT等。最好的方法是将汇总和计数存储在单独的数据类型中,您可以轻松地查询该数据类型,并在用户每次投票时进行更新。  AppEngine可以更轻松地花费时间进行编写,以便以后可以进行更快的查询。 这是Java对象的示例:
@PersistenceCapable
public class User{
    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Key key;
    ...
}

@PersistenceCapable
public class Vote{
    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Key key;

    @Persistent
    private Key userKey;  // References a User
    ...
}

@PersistenceCapable
public class UserStats{
    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Key key;

    @Persistent
    private Key userKey;  // References a User
    ...
}
此外,由于基础数据存储区旨在轻松处理海量数据集上的查询,因此在AppEngine中,传统分片方式没有多大意义。例外是,如果您有一个可以经常更改的特定计数器,并且有可能多个用户同时更改它。与您在MySQL中使用的分片方式不同。这是Google在分片计数器上的文章:http://code.google.com/appengine/articles/sharding_counters.html