J'ai regardé cette vidéo de Google I/O 2009: http://www.youtube.com/watch?v=AgaL6NGpkB8 où Brett montre l'exemple de microblogging. Il décrit deux schémas datastore:
premier un:
class Message(db.Model):
sender = db.StringProperty()
body = db.TextProperty()
receivers = db.StringListProperty()
et seconde un:
class Message(db.Model):
author = db.StringProperty()
message = db.TextProperty()
class MessageIndex(db.Model)
receivers = db.StringListProperty()
Et il dit que dans le premier exemple datastore doit sérialisation/récepteurs délinéariser propriété chaque fois que nous interrogeons les messages par le récepteur, et dans la deuxième exaple n'a pas. Je ne comprends pas pourquoi Datastore se comporte différemment dans cet exemple, dans les deux cas, Receivers est juste StringListProperty. Pouvez-vous expliquer cela?GAE datastore liste propriété sérialisation
Répondre
Dans son exposé, il suppose que lorsque vous interrogez, vous voulez récupérer le contenu du message - 'expéditeur' et 'corps'. Dans App Engine, les entités sont désérialisées dans leur ensemble - vous ne pouvez pas simplement charger certains champs - alors lorsque vous lancez une requête dans le premier exemple, vous devez charger la liste entière des récepteurs.
Dans le second exemple, vous pouvez effectuer une requête sur clé uniquement sur MessageIndex, puis récupérer et charger les entités Message correspondantes. Comme vous ne chargez jamais les propriétés MessageIndex en mémoire, vous n'avez pas besoin de désérialiser la propriété de liste volumineuse et coûteuse qui leur est associée.
Notez qu'il existe une nouvelle fonctionnalité, les requêtes de projection, qui vous permet d'obtenir une vue partielle de vos entités, mais UNIQUEMENT sur les propriétés indexées.
https://developers.google.com/appengine/docs/python/datastore/projectionqueries
Comment cela fonctionne en interne, est que vos entités, les clés et les index sont tous stockés dans des tables différentes. Si vous obtenez l'entité entière, vous devez effectuer la recherche dans la table des entités principales, ce qui est coûteux car elle doit désérialiser l'ensemble (et se contenter de tout autre processus dans cette table). Une requête de projection est comme une requête-clé, excepté qu'à la place de votre clé d'entité, elle utilise un ensemble de valeurs indexées comme une clé (parce que c'est ainsi que fonctionnent les tables d'index en interne). Si vous voulez un sous-ensemble de données et pouvez justifier de payer pour l'indexer (ou s'il est déjà indexé), une requête de projection sera rapide et bon marché; il ne regarde que dans les tables d'index et n'a pas besoin de toucher l'entité ou les tables de clés.
PS: une propriété de liste est très onéreuse car elle crée une entrée dans l'élément PER de la table d'index dans la liste. De cette façon, vous pouvez exécuter une requête == et récupérer tout élément avec une correspondance. C'est la partie la plus coûteuse de la sérialisation que vous voulez éviter. Et ce n'est pas seulement l'entité de/serialization qui devient chère; C'est la quantité d'écritures nécessaire pour mettre à jour une valeur avec les propriétés de la liste (et deux propriétés de la liste seront exponentielles si vous ne faites pas attention à la déclaration manuelle des index). – Ajax
- 1. Enregistrer des fichiers binaires sur GAE/J + Google DataStore
- 2. Fonctionnement des versions Datastore et App sur GAE/J
- 3. Sérialisation d'une très grande liste
- 4. sérialisation, attribuer à une forte propriété type
- 5. Datastore optimisation d'accès
- 6. Comment implémenter efficacement des sessions dans GAE?
- 7. Texte formaté dans GAE
- 8. Liste <Int> sérialisation XML
- 9. Sérialisation d'une liste <T> en XML avec héritage
- 10. Comment supprimer une balise XML pour la propriété de liste
- 11. Interroger un comportement étrange. Google App Engine datastore
- 12. sérialisation d'une classe dérivée qui cache une propriété de base
- 13. GAE + Django. app-engine-patch ou django-gae-helpers?
- 14. Python Inspect - Recherche le type de données pour une propriété dans un GAE db.model Classe
- 15. Fichier Python à GAE
- 16. StringListProperty dans GAE
- 17. IA d'échecs pour GAE
- 18. StringListProperty dans GAE/J
- 19. GAE unowned relation JPA
- 20. Google App Engine Datastore multi-champ clé
- 21. une collection de Enums avec le moteur Google app datastore
- 22. Sérialisation de la liste Python - méthode la plus rapide
- 23. sérialisation XML de la liste <T> - XML Racine
- 24. GAE For Java: API Mail
- 25. Connexions HTTP GAE et JRuby
- 26. étiquette d'objets dans GAE Django
- 27. Objet Dozer sur GAE/J
- 28. Erreur Eclipse + PyDev + GAE memcache
- 29. Débogage NetBeans de Python (GAE)
- 30. Problème de sérialisation .Net
Je l'ai déjà compris, mais merci quand même :). Tu as tout à fait raison. – giolekva