1

Je m'essaie à google appengine et j'utilise le datastore avec php et quercus. Je ne suis pas familier avec Java ou Python, donc beaucoup d'apprentissage se passe ici. J'ai des pages de rendu, et je suis en mesure d'obtenir des données dans et hors de la banque de données.structure de données appengine - enfant, parent ou les deux?

L'application que je développe a des utilisateurs, des groupes, des sujets et des commentaires. Un groupe a des utilisateurs et les utilisateurs peuvent appartenir à plusieurs groupes. Lorsqu'un utilisateur se connecte, j'affiche les groupes dont il est membre et les sujets de ces groupes.

Je l'ai maintenant construit en MySQL, et je suis en train de trouver comment l'intégrer à appengine. Comme je le vois, un groupe est un parent qui a des sujets et des utilisateurs comme des enfants. Les sujets ont des commentaires en tant qu'enfants.

Cependant, je dois obtenir les groupes auxquels un utilisateur appartient lorsque l'utilisateur se connecte. Par conséquent, je pensais à une entité parent séparée qui stocke l'utilisateur, le contact et les informations de connexion, et cet utilisateur aurait des enfants contenant l'identifiant de groupe auquel chaque utilisateur appartient, afin que je sache quels groupes chercher.

Les utilisateurs sont des enfants du groupe afin que je puisse afficher tous les utilisateurs d'un groupe, mais il existe peut-être un moyen plus efficace de le faire.

Vous aimez cette

 
Groups(EntityGroup) - GroupName, Owner 
↳ Topics - TopicName, Content, Owner 
     ↳ Comments - Comment, Owner 
↳ Users - userid 

Users(EntityGroup) - userName, email, password 
↳ userGroup - groupid 

Ensuite, lorsqu'un utilisateur se connecte, la logique ressemble à ce

 
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; 
    } 
} 

La raison pour laquelle je regarde comme ça parce que quand un utilisateur se connecte à , Je ne peux pas très bien aller à travers chaque groupe pour l'utilisateur, et je voudrais seulement stocker les informations de connexion en un seul endroit.

Veuillez ne pas me recommander à la documentation de code.google.com, comme je l'ai déjà fait plusieurs fois, mais je ne comprends pas complètement ce qui se passe avec appengine.

De même, est-ce que j'ai décrit ci-dessus la façon correcte de visualiser le magasin de données? Je pense que la visualisation des données a été un combat qui pourrait causer certains des problèmes.

Répondre

1

Il me semble qu'il existe une relation plusieurs-à-plusieurs entre les utilisateurs et les groupes, oui? Un utilisateur peut appartenir à plusieurs groupes, et un groupe peut avoir plusieurs utilisateurs qui y sont abonnés. La manière la plus logique de représenter ceci est AppEngine to est de donner à l'entité User une propriété ListProperty qui contient la clé de l'eahc des groupes auxquels il appartient. En Python, il ressemblerait à ceci:

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

Chaque fois que l'utilisateur est abonné au groupe, vous ajoutez la clé du Groupe à la liste des groupes.

De même, l'entité Group aura une propriété ListProperty qui contient les clés de chaque utilisateur qui lui appartient.

Vous ne voudriez pas faire des utilisateurs des enfants du groupe, car cela rendrait très difficile ou impossible pour un utilisateur d'appartenir à plus d'un groupe.La difficulté que vous aurez est que lorsqu'un utilisateur rejoint un groupe, vous devrez mettre à jour le groupe dans une transaction - vous ne pouvez avoir qu'un seul utilisateur ajouté à un groupe à la fois; Sinon, vous avez la possibilité qu'une écriture écrase une autre. Vraisemblablement, l'utilisateur peut être mis à jour en dehors d'une transaction, car il ou elle devrait seulement rejoindre un groupe à la fois.

+0

Merci Adam, ça confirme ma réflexion. Je ne devrais pas avoir à m'inquiéter de l'ajout d'un utilisateur à plusieurs groupes à la fois. Je ne pensais pas à 'list property' pour l'entité User ou pour le groupe, bien que je l'ai vu plusieurs fois maintenant. Je pensais à un enfant pour chaque groupe auquel appartient l'utilisateur, mais je regarderai de plus près ListProperty, car cela semble être le chemin à suivre. Merci pour votre réponse très complète. – pedalpete