我目前正在开发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或添加新的用户名,我可能需要更新大量的记录。这真的是要走的路吗?
答案 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)
然后您可以立即查询给定用户可以访问的列表。