2010-10-23 10 views
3

Ok. Je travaille avec GAE. Et je veux créer quelque chose comme ceci:GAE problème de structure de données d'organisation

Je types "groupe" "topic" "tag":

  1. chaque "groupe" peut avoir autant de "sujets" au besoin

  2. chaque "sujet" peut avoir autant de "balises" au besoin

  3. chaque « groupe » peut avoir autant de « tags » au besoin

c'est quelque chose comme cercle.

droite j'ai maintenant quelque chose comme ceci:

class TopicGroup(db.Model): 
    value = db.StringProperty(required=True) 

class Topic(db.Model): 
    title = db.StringProperty(required=True) 
    group = db.ReferenceProperty(TopicGroup, 'group', 'topics', required=True) 

class TopicTag(db.Model): 
    topic = db.ReferenceProperty(Topic, 'topic', 'tags', required=True) 
    group = db.ReferenceProperty(TopicGroup, 'group', 'tags', required=True) 
    value = db.StringProperty(required=True) 

mais ce n'est pas bon (dans mon modèle « sujet » ne peut avoir qu'une seule étiquette, mais je Nead « sujet » d'avoir autant de balises au besoin

Eh bien j'ai déjà une fissure dans ma tête ... y at-il quelqu'un qui pourrait aider?

Répondre

5

Les jointures plusieurs-à-plusieurs peuvent être implémentées en tant que tables de jointure (ou modèles de relation). Dans la solution ci-dessous, il existe un modèle qui contient toutes les balises qui sont appliquées à Groups (GroupTags) et un modèle qui contient les balises qui sont appliquées à Topics (TopicTags).

Découplage lui-même Tag de références à la Tag vous permet de faire des choses comme modifier l'orthographe d'une balise sans avoir besoin de mettre à jour tous les Group ou Topic auquel cette Tag est appliquée.

En outre, ce modèle tire parti du fait qu'AppEngine crée des références arrières automatiques sur les entités auxquelles d'autres entités les référencent. Dans les modèles ci-dessous, une entité Groupe aura une propriété appelée topics qui est une requête qui va chercher toutes les entités Topic qui sont group points de référence à ce Group. De même, chaque Group obtient une propriété tags du modèle GroupsTags qui lui donne toutes les entités Tag qui lui appartiennent. Chaque entité Tag obtient une propriété groups et topics qui est une requête pour toutes les entités de ces types auxquelles la balise donne est attribuée, ce qui rend la recherche par balise (opération très typique) assez simple.

C'est une approche très puissante et flexible pour modéliser des systèmes tels que le vôtre.

class Group(db.Model): 
    # All of my group-specific data here. 

class Topic(db.Model): 
    title = db.StringProperty(required=True) 
    group = db.ReferenceProperty(Group, collection='topics') 
    # other topic-specific data here. 

class Tag(db.Model): 
    text = db.StringProperty(required=True) 

class GroupTags(db.Model): 
    group = db.ReferenceProperty(Group, collection='tags') 
    tag = db.ReferenceProperty(Tag, collection='groups') 

class TopicTags(db.Model): 
    topic = db.ReferenceProperty(Topic, collection='tags') 
    tag = db.ReferenceProperty(Tag, collection='topics') 
+0

Wow ... Tnx beaucoup .. vous sauvez ma journée :) Je commence juste à travailler avec GAE .. donc c'est un peu difficile pour moi. Quoi qu'il en soit tnx encore. –

2

La solution consiste à utiliser db.ListProperty avec un type de db.Key. voir: http://code.google.com/appengine/articles/modeling.html (section many to many)

+1

La principale limitation de cette approche est que ListProperty est limité à 5000 valeurs.De même, effectuer des opérations telles que la suppression de toutes les références à une entité ainsi référencée peut être très difficile; vous devez interroger chaque entité qui a la clé à supprimer dans sa liste, puis mettre à jour chaque liste. Cela ne s'adapte pas bien à un grand nombre d'entités. –

+0

Oui, mais db.get (a_list) est beaucoup plus rapide. Donc, cela dépend de ce que vous utilisez. Si un sujet peut avoir plus de 1mega de clés, ok ... mais peu propable – sahid

+0

Votre argument selon lequel faire un 'get' sur une liste de clés est très efficace, donc si le système écrit rarement et que la plupart du temps il lit, alors votre solution a un avantage significatif. –

Questions connexes