2011-06-07 1 views
2

J'essaie de créer un site similaire à Twitter. Les utilisateurs pourront poster des messages. Et les utilisateurs pourront se "suivre" les uns les autres. Sur la page d'accueil, ils voient les messages des utilisateurs qu'ils suivent, triés par heure.Structure de la base de données Twitter-ish dans Google App Engine

Comment puis-je créer les modèles appengine pour cela?

Dans une DB relationnelle traditionnelle, je pense que ce serait quelque chose comme ceci:

Database 'utilisateur':

  • id
  • nom d'utilisateur

Database 'suit':

  • us er_id
  • follow_id

Base de données 'messages':

  • user_id
  • un message

Et la requête sera quelque chose comme:

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

Je suppose que j'étais clair avec l'exemple ci-dessus. Comment répliquer cela dans Google App Engine?

Répondre

1

RÉVISÉE:

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() 

Vous pouvez ensuite interroger les résultats en deux étapes:

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) 

(avec 'current_user' étant entité la 'appuser' correspondant w vec votre utilisateur actif)

+0

mais cela ne fonctionne pas dans ce scénario: - 1) L'utilisateur A affiche un message, 2) L'utilisateur B suit l'utilisateur A, 3) Maintenant, , L'utilisateur B ne sera pas en mesure de voir le message posté en (1) .. En outre, 1) L'utilisateur A suit l'utilisateur B 2) L'utilisateur B envoie un message, 3) L'utilisateur A suit l'utilisateur B, 4) L'utilisateur A verra toujours le message affiché dans (2) .. Ai-je raison? – Shrihari

+0

Vous avez raison, il ne serait pas compatible avec le suivi historique/rétroactif. J'ai posté une solution révisée qui, je pense, accomplirait ce que vous visez. –