1

我想我的手在谷歌appengine和使用数据存储与PHP和栎。 我对Java或Python不熟悉,所以很多学习都在这里进行。我有页面呈现,并且我能够从数据存储中获取数据。appengine数据结构 - 孩子,父母还是两者?

我正在构建的应用程序包含用户,组,主题和评论。 一个组有用户,用户可以属于多个组。 当用户登录时,我会显示他们所属的组以及这些组的主题。

我已经有了这个目前在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

它看起来像是用户和组之间存在多对多的关系,是吗?用户可以属于多个组,并且一个组可以有许多订阅了它的用户。表示这种情况最合乎逻辑的方式是AppEngine to给用户实体一个ListProperty,该ListProperty持有他所属组的eahc的Key。在Python中,它应该是这样的:

class User(db.Model): 
    userName = db.StringProperty() 
    email = db.EmailProperty() 
    password = db.StringProperty() 
    groups = ListProperty(db.Key) 

每当用户订阅了组,则添加组的关键组列表。

同样,Group实体将有一个ListProperty,它包含属于它的每个用户的密钥。

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

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

+0

谢谢亚当,这证实了我的想法。我不应该担心用户被一次添加到多个组中。我并没有为用户实体或小组思考'list property',尽管我现在已经看过几次了。我正在为用户所属的每个小组想一个孩子,但我会仔细看看ListProperty,因为这听起来像是要走的路。感谢您的非常彻底的回应。 – pedalpete 2010-01-10 02:46:31