开发者

Twitter-ish DB structure in Google App Engine

开发者 https://www.devze.com 2023-03-11 20:36 出处:网络
I\'m trying to create a site which is quite similar to Twitter. Users will be able to post messages. And users will be able to \'follow\' each other. On the homepage, they see the messages from开发者_

I'm trying to create a site which is quite similar to Twitter. Users will be able to post messages. And users will be able to 'follow' each other. On the homepage, they see the messages from开发者_StackOverflow社区 the users they follow, sorted by time.

How do I go about creating the appengine models for this?

In a traditional relational DB, i guess it would be something like this:

Database 'user':

  • id
  • username

Database 'follows':

  • user_id
  • follow_id

Database 'messages':

  • user_id
  • message

And the query will be something like:

SELECT * FROM messages m, follows f WHERE m.user_id = f.follow_id AND f.user_id = current_user_id

I guess i was clear with the example above. How do I replicate this in Google App Engine?


There is a useful presentation at Google I/O a while back by Brett Slatkin which describes building a scalable twitter-like microblog app, and deals with this very question at length: http://www.google.com/events/io/2009/sessions/BuildingScalableComplexApps.html


REVISED:

class AppUser(db.Model):
    user_id = db.UserProperty()
    username = db.StringProperty()
    following = db.ListProperty(db.Key) # list of AppUser keys

class Message(db.Model):
    sender = db.ReferenceProperty(AppUser)
    body = db.TextProperty()  

You would then query the results in two steps:

message_list = []
for followed_user in current_user.following:
    subresult = db.GqlQuery("SELECT __key__ FROM Message WHERE sender = :1", followed_user)
    message_list.extend(subresult)

results = Message.get(message_list)

(with 'current_user' being the 'AppUser' entity corresponding with your active user)

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号