我正在使用java和数据存储区开展我的第一个GAE项目。这是我第一次尝试使用noSQL数据库。像很多人一样,我在理解正确使用的模型时遇到了问题。到目前为止,我已经找到了两个模型,我需要帮助才能选择合适的模型。
所有数据都分为两个类User.class
和Word.class
。
用户:几个字符串与用户数据(用户名,电子邮件.....)
Word:两个字符串
哪个更好:
在10 000 000个实体中搜索我需要的100个实体。例如,每个实体Word
都有一个字符串属性owner
和i查询(owner = ‘John’
)。
在User.class
我添加属性List<Word>
和返回单词列表的方法getWords()
。所以我在1000个用户中查询我需要的那个,然后调用类似getWords()
的方法,返回List<Word>
我需要的那个。
哪一个使用的资源更少?或者我是否采用了错误的方式?
答案 0 :(得分:0)
答案是使用appstats,你可以找到:
为了确保您的应用程序快速,您需要知道:
您的应用程序是否进行了不必要的RPC调用?它应该缓存吗? 数据而不是重复RPC调用来获取相同的数据?将 如果执行多个请求,您的应用程序执行得更好 并行而非连续?
运行一些测试,尝试两种方式,看看appstats说的是什么。
但我会说你的选项2)更好,因为你不需要搜索数百万个实体。但谁知道肯定?麻烦的是“资源”是app引擎中的十几种不同的东西--CPU,数据存储读取,数据存储写入等等。
答案 1 :(得分:0)
对于您的User类,请为每个用户设置唯一ID(例如用户名或电子邮件地址)。对于Word类,请将每个Word类的父级设置为特定用户。
因此,如果您想查找特定用户的单词,您可以对属于该特定用户的所有单词执行祖先查询。
通过为每个用户设置ID,您可以按ID获取该用户,而不是执行其他查询。
有关祖先查询的更多信息: https://developers.google.com/appengine/docs/java/datastore/queries#Ancestor_Queries
有关ID的更多信息: https://developers.google.com/appengine/docs/java/datastore/entities#Kinds_and_Identifiers
答案 2 :(得分:0)
这实际上取决于您正在使用的查询。我假设你想找到给予某个所有者的所有单词。
最有可能的是,2会更便宜,因为您需要获取用户实体而不是运行查询。
2对您来说将更多一些工作,因为您需要手动保持列表与Word实例同步
在我的脑海中,我可以想到#2的2个问题,这些问题可能适用于您,也可能不适用于您:
一个。如果您想查找给定某个单词的所有所有者,您需要保留索引的单词列表。这会影响您的成本。如果你主要是通过所有者找到单词,并且很少通过单词找到所有者,那么这样做仍然有意义。但是,如果您的搜索模式翻转并且您正在通过单词搜索所有者,这可能是错误的设计。如您所见,您需要根据您将要使用的查询来设计模型。
B中。实体限制为1MB,索引属性的数量有限(我认为5000?)。这两个将限制您可以存储在列表中的单词数。确保每个用户不需要超过该字数限制。方法1允许每个用户使用无限制的单词。