Répondre

21

La meilleure option dépend de vos besoins. Voici quelques solutions (je suppose que vous utilisez Python, puisque vous n'avez pas spécifié):

  1. Si vous devez faire des mises à jour transactionnelles sur un arbre entier, et tu ne vas pas avoir plus Au sujet de 1QPS de mises à jour soutenues à un arbre, vous pouvez utiliser le support intégré pour le stockage heirarchial. Lors de la création d'une entité, vous pouvez passer l'attribut "parent" pour spécifier une entité ou clé parent, et lors de l'interrogation, vous pouvez utiliser la méthode .ancestor() (ou 'ANCESTOR IS' dans GQL pour récupérer tous les descendants d'une entité donnée
  2. Si vous n'avez pas besoin de mises à jour transactionnelles, vous pouvez répliquer la fonctionnalité des groupes d'entités sans les problèmes de contention (et la sécurité des transactions): Ajoutez un db.ListProperty (db.Key) à votre modèle appelé 'ancestors'; remplissez-le avec la liste des ancêtres de l'objet que vous insérez.Puis vous pouvez facilement récupérer tout ce qui descend d'un ancêtre donné avec MyModel.all(). filter ('ancestors =', parent_key)
  3. Si vous ne le faites pas Vous n'avez pas besoin de transactions, et vous ne vous souciez que de récupérer les enfants directs d'une entité (pas tous les descendants), utilisez l'approche décrite ci-dessus, mais à la place d'un ju de ListProperty st utilise ReferenceProperty pour l'entité parente. Ceci est connu comme une liste d'adjacence.

Il existe d'autres approches disponibles, mais ces trois devraient couvrir les cas les plus courants.

+0

Point (2) répond à ma requête! Merci. – MathOldTimer

+2

Il semble que (2) et (1) font la même chose, mais que (1) serait beaucoup moins cher. Il me semble qu'une liste de clés est assez chère en termes de coût de stockage, qui ne ferait que s'aggraver à mesure que l'arbre se creuserait. En outre, ne serait pas (1) conduire à une bonne localité? –

+3

Le support ancêtre intégré utilise la même technique que 2 - il stocke une liste d'ancêtres en interne. L'avantage de 2 est que vous n'avez pas la limitation du taux de transaction. La localité n'est pas un problème. –

2

Eh bien, vous devriez essayer de garder vos données aussi linéaire que possible. Si vous avez besoin d'interroger rapidement une structure arborescente de données, vous devrez soit la stocker dans la base de données (ou codée en JSON si vous préférez) si cela est possible pour vos données, ou vous devrez générer des index d'arbre qui peuvent être utilisé pour interroger rapidement un morceau d'une structure d'arbre. Toutefois, je ne suis pas certain de la performance de Google App Engine lors de la mise à jour de ces index. En ce qui concerne Google App Engine, votre principale préoccupation devrait être de réduire le nombre de requêtes que vous devez effectuer et que vos requêtes retournent le moins de lignes possible. Les opérations sont coûteuses, mais le stockage ne l'est pas, donc la redondance ne devrait pas être considérée comme une mauvaise chose.

Voici quelques réflexions sur le sujet que je trouve par googler (bien que pour MySQL, mais vous pouvez obtenir l'idée générale de celui-ci): Managing Hierarchical Data in MySQL

Ah et est ici une discussion pour Google App Engine: Modeling Hierarchical Data

0

Une façon consiste à utiliser l'attribut parent du modèle. Vous pouvez ensuite utiliser les fonctions query.ancestor() et model.parent().

Je suppose que cela dépend du type d'opérations que vous voulez effectuer sur ces données, ce qui déterminerait la meilleure façon de le représenter.

+2

Ce n'est pas une bonne idée. Les groupes d'entités ne doivent être utilisés que lorsque cela est nécessaire pour les transactions. From documentation: "N'utilisez les groupes d'entités que lorsqu'ils sont nécessaires pour les transactions Pour les autres relations entre entités, utilisez les propriétés ReferenceProperty et les valeurs Key, qui peuvent être utilisées dans les requêtes." – Blixt

+0

Rappelez-vous également: le parent d'une entité ne peut pas être changé, mais un objet ReferenceProperty peut le faire! – Trevor

Questions connexes