Google app engine 选择正确的数据存储和查询模型?
我正在使用java和数据存储进行我的第一个GAE项目。这是我第一次尝试使用noSQL数据库。像很多人一样,我在理解正确的模型时遇到问题。到目前为止,我已经想出了两种模式,我需要帮助选择正确的一个 所有数据以两个类表示Google app engine 选择正确的数据存储和查询模型?,google-app-engine,Google App Engine,我正在使用java和数据存储进行我的第一个GAE项目。这是我第一次尝试使用noSQL数据库。像很多人一样,我在理解正确的模型时遇到问题。到目前为止,我已经想出了两种模式,我需要帮助选择正确的一个 所有数据以两个类表示User.class和Word.class 用户:带有用户数据的两个字符串(用户名、电子邮件…) 单词:两个字符串 哪一个更好: 在10000个实体中搜索我需要的100个。例如,每个实体Word都有一个字符串属性owner,我查询(owner='John') 在User.clas
User.class
和Word.class
- 用户:带有用户数据的两个字符串(用户名、电子邮件…)
- 单词:两个字符串
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允许每个用户使用未限定的单词。可能是找到它的最佳途径。谢谢你,我还没有考虑到极限。你帮我解决了很多问题。我会检查祖先查询。非常感谢。