Question

Quelqu'un peut-il illustrer comment je peux stocker et interroger facilement des données hiérarchiques dans la banque de données Google App Engine?

Était-ce utile?

La solution

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 effectuer des mises à jour transactionnelles sur une arborescence complète et que vous ne disposerez pas de plus de 1 QPS de mises à jour soutenues pour une arborescence donnée, vous pouvez utiliser la prise en charge intégrée du stockage hiérarchique. Lors de la création d'une entité, vous pouvez transmettre le " parent " attribut pour spécifier une entité parent ou une clé, et lors d’une requête, vous pouvez utiliser la méthode .ancestor () (ou 'ANCESTOR IS' dans GQL pour extraire tous les descendants d’une entité donnée.
  2. Si vous n'avez pas besoin de mises à jour transactionnelles, vous pouvez répliquer les fonctionnalités des groupes d'entités sans les problèmes de conflit (et la sécurité des transactions): ajoutez un db.ListProperty (db.Key) à votre modèle, appelé "ancêtres", et remplissez-le. avec la liste des ancêtres de l'objet que vous insérez. Ensuite, 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 n'avez pas besoin de transactions et si vous ne voulez récupérer que les enfants directs d'une entité (pas tous les descendants), utilisez l'approche décrite ci-dessus, mais au lieu d'un ListProperty, utilisez simplement un ReferenceProperty pour l'entité parent. C’est ce qu’on appelle une liste d’adjacence.

D'autres approches sont disponibles, mais ces trois solutions devraient couvrir les cas les plus courants.

Autres conseils

Eh bien, vous devriez essayer de garder vos données aussi linéaires que possible. Si vous avez besoin d'interroger rapidement une arborescence de données, vous devrez soit la stocker dans la base de données (ou codée JSON si vous préférez) si cela est possible pour vos données, ou vous devez générer des index d'arborescence pouvant être utilisé pour interroger rapidement un élément d'une arborescence. Cependant, je ne sais pas comment Google App Engine fonctionnera lors de la mise à jour de ces index.

En ce qui concerne Google App Engine, votre préoccupation principale doit être de réduire le nombre de requêtes à effectuer et de renvoyer le moins de lignes possible. Les opérations sont coûteuses, mais le stockage ne l’est pas, aussi la redondance ne devrait-elle pas être considérée comme une mauvaise chose.

Voici quelques réflexions sur le sujet que j'ai trouvées en googlant (bien que pour MySQL, mais vous pouvez en tirer une idée générale): Gestion des données hiérarchiques dans MySQL

Ah, voici une discussion sur Google App Engine: Modélisation des données hiérarchiques

Une solution 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ération que vous souhaitez effectuer sur ces données, qui déterminerait la meilleure façon de la représenter.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top