appengine数据结构 - 孩子,父母或两者兼而有之?

时间:2010-01-09 22:41:30

标签: google-app-engine data-structures google-cloud-datastore

我正在尝试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正在发生什么。

另外,我在上面概述了可视化数据存储的正确方法吗?我认为可视化数据一直是一场可能导致一些挑战的斗争。

1 个答案:

答案 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,其中包含属于它的每个用户的密钥。

您不希望让用户成为群组的子女,因为这会使用户很难或不可能属于多个群组。

您将遇到的困难是,当用户加入群组时,您需要在交易中更新群组 - 您一次只能将一个用户添加到群组中;否则,你有可能一次写入会覆盖另一次写入。据推测,用户可以在交易之外进行更新,因为他或她一次只能加入一个组。