我正在尝试google appengine并使用带有php和quercus的数据存储区。 我不熟悉Java或Python,所以这里有很多学习。我有页面渲染,我可以将数据输入和输出数据存储区。
我正在构建的应用包含用户,群组,主题和评论。 组具有用户,用户可以属于多个组。 当用户登录时,我会显示他们所属的组以及这些组的主题。
我目前已经在MySql中构建了这个,现在我正在弄清楚如何将它变成appengine。
我看到它的方式,一个小组是一个父母,主题和用户作为孩子。主题有孩子的评论。
但是,我必须在用户登录时获取用户所属的组。因此,我想到了一个单独的父实体,它存储用户,联系人和登录信息,并且该用户将拥有包含每个用户所属的组ID,以便我知道要获取的组。
用户是该组的孩子,因此我可以显示组的所有用户,但也许有更有效的方法。
喜欢这个
Groups(EntityGroup) - GroupName, Owner ↳ Topics - TopicName, Content, Owner ↳ Comments - Comment, Owner ↳ Users - userid Users(EntityGroup) - userName, email, password ↳ userGroup - groupid
然后,当用户登录时,逻辑看起来像这样
SELECT groupid FROM Users where password=hashofpassword+uniqueusername foreach(groupid as group){ SELECT users from group; SELECT topics from group foreach(topicid as topic){ SELECT comments; } }
我这样看的原因是因为当用户登录时,我不能很好地查看用户的每个组,我只想将登录信息存储在一个地方。
请不要向我推荐code.google.com文档,因为我已经经历了很多次,但我并不完全了解appengine正在发生什么。
另外,我在上面概述了可视化数据存储的正确方法吗?我认为可视化数据一直是一场可能导致一些挑战的斗争。
答案 0 :(得分:1)
在我看来,用户和群组之间存在多对多关系,是吗?用户可以属于多个组,并且组可以拥有许多订阅它的用户。表示这一点的最合理的方式是AppEngine是为User实体提供一个ListProperty,它包含他所属的组的eahc的Key。在Python中,它看起来像这样:
class User(db.Model):
userName = db.StringProperty()
email = db.EmailProperty()
password = db.StringProperty()
groups = ListProperty(db.Key)
每当用户订阅该群组时,您都会将群组的密钥添加到群组列表中。
同样,Group实体将有一个ListProperty,其中包含属于它的每个用户的密钥。
您不希望让用户成为群组的子女,因为这会使用户很难或不可能属于多个群组。
您将遇到的困难是,当用户加入群组时,您需要在交易中更新群组 - 您一次只能将一个用户添加到群组中;否则,你有可能一次写入会覆盖另一次写入。据推测,用户可以在交易之外进行更新,因为他或她一次只能加入一个组。