抱歉,如果这个问题非常基本,但我开始看到 Android 应用程序没有 sql 存储,并且我发现应用程序引擎端点和 servlet 据我所知,公开了一个 api 来执行 CRUD 操作。
对我来说很难掌握的是存储对象的格式及其效率。我读到,通过使用像 objectify/gson 这样的库,对象存储在 json 中。
现在,假设我有一个 Person 类,它的 Friends 属性是 Person 的列表。如果两个不同的人共享同一个朋友,它将存储在两个不同的 json 对象中,从而复制信息。我是否应该为存储创建一个不同的类来保存朋友的 id,然后在加载一个人时从 Person 的哈希映射中找到他/她的朋友?但这意味着请求 Web 服务的所有人来构建该地图,即使我只想找到一个没有朋友的人。
另一种方法是在服务器端进行“查询”,返回被请求的人的好友对象,并将它们放入哈希映射中,以供将来“查询”其他人。通过这种方式,我每次传输的数据会更少,但我会消耗更多次的网络服务,这可能会导致每日请求限制配额耗尽。
再次对初学者的问题表示歉意。我将不胜感激任何解决这个问题的方向和模式,简而言之,如何有效地(在空间意义上)存储对象并有效地检索它们(在从 Web 服务的查询和数据传输量的意义上) nosql 数据库。
事实上,Google Cloud Endpoints 将允许您通过一个或多个 API 执行 CRUD 操作。但是,正如文档 (https://cloud.google.com/appengine/docs/java/endpoints/) 中详细介绍的,它允许您做的事情远不止这些,例如“App Engine 中提供的所有服务和功能,例如 Google 云存储、邮件、任务队列”等。
当端点的后端是数据存储时,您可以使用 Objectify。 Objectify 是 Google 推荐的 Java 开源 API。但是,请注意,数据不是存储为 json,而是存储为称为“实体”的数据对象,这些对象可以具有不同数据类型的属性。请参阅 https://cloud.google.com/appengine/docs/java/datastore/entities 了解更多信息。
在数据建模方面,NoSQL 数据库的方法与关系数据库有很大不同。您不应该关心数据的标准化,多次存储相同的数据是一种非常常见的方法。
在您的情况下,如果两个人共享同一个朋友,您将在每个人实体中保存朋友信息两次。这样,当您要查询一个人的好友列表时,您只需在端点中通过 Objectify 获取该人实体:它将包含好友列表,并且在发送到前端时会自动转换为 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://rominiirani.com/google-cloud-endpoints-tutorial-part-1-b571ad6c7cd2#.p4h8rmkt3 有针对 Eclipse 和 Android 的教程Studio(我建议使用第二个)。