java - 高效使用 GAE DataStore

标签 java google-app-engine google-cloud-datastore objectify

我目前正在开发一个 Google AppEngine (GAE) 应用程序,我在 GAE DataStore 最佳实践方面遇到了一些困难。我想以最有效的方式使用 DataStore。我正在使用 Objectify 框架,但如果有更好的选择,我可以灵活地使用其他框架。

我的应用程序使用三个对象/表: - 项目(id,描述) - 列表 (id, listId, listDescription - SecurityProfile (id,listId, username, accessType)

我是一个关系世界,我的 Items 和 SecurityProfiles 表会有一个外部键将它们链接到一个列表 (ListId),然后我会在我的查询中使用连接。

我需要进行的典型查询: - 获取特定用户可访问的所有列表(需要“用户名”索引以按用户名过滤并需要从列表表中获取描述) - 获取特定用户列表中的所有项目(获取链接到上面查询中检索到的列表的项目)

我正在努力想出一种以有效方式链接不同对象的方法(最小化 DataStore 查询和索引)。

我在其他帖子中看到应该避免连接,我应该尽可能地去规范化模型。

这样只创建一个对象: - 数据(id, description, listId, listDescription, username, accessType)

我可以从读取的角度看到它是如何工作的,但是如果我更新 listDescription、accessType 或添加新的用户名,我可能不得不更新大量记录。这真的是要走的路吗?

最佳答案

我只熟悉 Python NDB API,但在 Java 中情况类似。

Python NDB ,我建议为每个创建一个模型

  • 用户,
  • 列表,
  • 列表项

然后,您可以使用 repeated 来引用它们 KeyProperties,例如

class SecurityProfiles(ndb.Model):
    accessibleLists = ndb.KeyProperty(repeated=true)

class List(ndb.Model):
    listItems = ndb.KeyProperty(repeated=true)

像这样,您可以从 DataStore 中提取用户的配置文件,并使用存储在 accessibleLists 中的 key ,您可以获得用户可访问的列表。

或者,你可以反过来做:

class List(ndb.Model):
    usersWithAccess = ndb.KeyProperty(repeated=true)

然后您可以立即查询给定用户可以访问的列表。

关于java - 高效使用 GAE DataStore,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21375887/

相关文章:

java - Google App Engine 查询在 Java 中不起作用

google-app-engine - 如何从 Google Cloud Datastore 索引中删除条目?

java - @ConfigurationProperties 前缀不起作用

java - 从包含 utf 8 字符的属性文件中读取

java - keystore 和 trustore 不能一起工作

sockets - 分布式系统中客户端之间的websocket通信

google-app-engine - NDB 成员资格查询 ("IN"操作)性能是否会因许多可能值而降低?

java - 如何从其 JPanel 内容更改 JDialog 图标?

google-app-engine - 通过 Google App Engine 数据存储查看器删除实体不会从内存缓存中删除实体

google-app-engine - 直接将数据放入 AppEngine 的 Blobstore