有效使用GAE DataStore

时间:2014-01-27 08:18:16

标签: 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或添加新的用户名,我可能需要更新大量的记录。这真的是要走的路吗?

1 个答案:

答案 0 :(得分:1)

我只熟悉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中存储的密钥,您可以获得用户可以访问的列表。

或者,您可以反过来这样做:

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

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