Google app engine 选择正确的数据存储和查询模型?

Google app engine 选择正确的数据存储和查询模型?,google-app-engine,Google App Engine,我正在使用java和数据存储进行我的第一个GAE项目。这是我第一次尝试使用noSQL数据库。像很多人一样,我在理解正确的模型时遇到问题。到目前为止,我已经想出了两种模式,我需要帮助选择正确的一个 所有数据以两个类表示User.class和Word.class 用户:带有用户数据的两个字符串(用户名、电子邮件…) 单词:两个字符串 哪一个更好: 在10000个实体中搜索我需要的100个。例如,每个实体Word都有一个字符串属性owner,我查询(owner='John') 在User.clas

我正在使用java和数据存储进行我的第一个GAE项目。这是我第一次尝试使用noSQL数据库。像很多人一样,我在理解正确的模型时遇到问题。到目前为止,我已经想出了两种模式,我需要帮助选择正确的一个

所有数据以两个类表示
User.class
Word.class

  • 用户:带有用户数据的两个字符串(用户名、电子邮件…)

  • 单词:两个字符串

哪一个更好:

  • 在10000个实体中搜索我需要的100个。例如,每个实体
    Word
    都有一个字符串属性
    owner
    ,我查询(
    owner='John'

  • User.class
    中,我添加属性
    List
    和返回单词列表的方法
    getWords()
    。所以我在1000个用户中查询我需要的一个,然后调用像
    getWords()
    这样的方法,该方法返回带有我需要的100个用户的
    List


  • 哪一个使用更少的资源?还是我做得不对?

    答案是使用appstats,您可以发现:

    要保持应用程序的快速运行,您需要知道:

    您的应用程序是否正在进行不必要的RPC调用?应该是缓存吗 数据,而不是重复进行RPC调用以获取相同的数据?意志 如果在中执行多个请求,则应用程序的性能会更好 并行而不是串行

    运行一些测试,尝试两种方法,看看appstats会怎么说


    但我认为你的选择2)更好,因为你不需要搜索数百万个实体。但谁能确定呢?问题是“资源”在应用程序引擎中有十几种不同的东西-CPU、数据存储读取、数据存储写入等。

    对于您的用户类,为每个用户设置一个唯一的ID(例如用户名或电子邮件地址)。对于Word类,将每个Word类的父级设置为特定用户

    因此,如果您想查找来自特定用户的单词,您将对属于该特定用户的所有单词执行祖先查询

    通过为每个用户设置一个ID,您可以按ID获取该用户,而不是执行额外的查询

    有关祖先查询的更多信息:

    有关身份证的更多信息:

    这实际上取决于您使用的查询。我假设你想找到某个所有者提供的所有单词

    最有可能的是,2会更便宜,因为您需要获取用户实体,而不是运行查询

    2将是您的一部分,因为您需要手动使列表与Word实例保持同步

    在我脑海中,我能想到#2的两个问题,这可能适用于你,也可能不适用于你:

    如果你想找到给定某个单词的所有所有者,你需要将该单词列表编入索引。这会影响你的成本。如果您主要是通过所有者查找单词,而很少通过单词查找所有者,那么这样做仍然是有意义的。但是,如果您的搜索模式发生了变化,并且您经常用文字搜索所有者,那么这可能是错误的设计。如您所见,您需要根据将要使用的查询设计模型


    B.实体限制为1MB,索引属性的数量也有限制(我想是5000?)。这两个选项将限制您可以存储在列表中的字数。确保您不需要超过每个用户的字数限制。方法1允许每个用户使用未限定的单词。

    可能是找到它的最佳途径。谢谢你,我还没有考虑到极限。你帮我解决了很多问题。我会检查祖先查询。非常感谢。