我目前正在开发一个 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/