对不起,如果这个问题是非常基本的,但我开始看到没有sql存储的android应用程序,我发现应用程序引擎端点和servlet,据我所知,暴露一个API做CRUD操作。
对我来说很难理解的是对象存储的格式和它的效率,我读到通过使用像objectify/gson这样的库,对象是用json存储的。
现在,假设我有一个类Person,它有一个属性Friends,它是Person的列表。如果两个不同的人共享同一个朋友,它将被存储在两个不同的json对象中,复制信息。我是否应该为存储创建一个不同的类,保存朋友的id,然后在加载一个人时从Person的哈希Map中找到他/她的朋友?但这意味着请求Web服务的所有Person来构造该Map,即使我只想找到一个没有朋友的Person。
另一种方法是在服务器端进行“查询”,返回被请求的人的朋友对象,并将它们放在哈希Map中,以备将来其他人的“查询”。这样,我每次传输的数据会减少,但我会消耗更多的网络服务次数,这可能会导致耗尽每日请求限制配额。
再次为初学者的问题道歉。我将感谢任何方向,模式来解决这个问题,简而言之,如何有效地-在空间的意义上-存储对象和有效地检索它们-在从Web服务的查询量和数据传输的意义上-在一个nosql数据库。
2条答案
按热度按时间2wnc66cl1#
事实上,Google Cloud Endpoints将允许您通过一个或多个API进行CRUD操作。但是,正如文档(https://cloud.google.com/appengine/docs/java/endpoints/)中详细说明的那样,它允许您做更多的事情,例如“App Engine中可用的所有服务和功能,例如Google Cloud Storage,Mail,Task Tools”等。
当端点的后端是Datastore时,您可以使用Objectify。Objectify是Google推荐的Java开源API。但是,请注意,数据不是存储为JSON,而是存储为称为“Entities”的Data对象,这些对象可以具有不同数据类型的属性。有关详细信息,请参阅https://cloud.google.com/appengine/docs/java/datastore/entities。
在数据建模方面,NoSQL数据库的方法与关系数据库非常不同。您不应该关心数据的规范化,并且多次存储相同的数据是一种常见的方法。
在您的例子中,如果两个人共享同一个朋友,您将在每个person实体中保存两次朋友信息。这样,当您查询一个人的朋友列表时,您只需在端点中通过Objectify获取person实体:它将包含朋友列表,并且在发送到前端时将自动转换为JSON。
我建议您尝试Google示例(https://cloud.google.com/appengine/docs/java/endpoints/helloworld-java-maven),或者更好地遵循Udacity MOOC,这将帮助您了解整个堆栈https://www.udacity.com/course/developing-scalable-apps-in-java--ud859
来自Romin Irani的教程也是这项技术的一个很好的切入点https://rominirani.com/google-cloud-endpoints-tutorial-part-1-b571ad6c7cd2#.p4h8rmkt3有Eclipse和Android Studio的教程(我建议使用第二个)。
dpiehjr42#
如果你使用的是像mongodb这样的nosql数据库,那么你可以在mongodb中使用聚合。你可以在db中只存储一次作为朋友的person实体,你可以使用聚合来查询和获取它们,而不是存储重复的实体。