2009-10-12 7 views
1

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

2

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.

+0

Je l'ai déjà compris, mais merci quand même :). Tu as tout à fait raison. – giolekva

0

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.

+0

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