Disons que je veux afficher une liste de livres et leurs auteurs. Dans la conception de base de données traditionnelle, j'émettais une seule requête pour récupérer les lignes de la table Book
ainsi que la table Author
associée, une étape connue sous le nom désirant aller chercher. Ceci est fait pour éviter le redouté N + 1 sélectionnez le problème: Si les enregistrements Author
ont été récupérés paresseusement, mon programme devrait émettre une requête distincte pour chaque auteur, peut-être autant de requêtes qu'il y a de livres dans la liste. Le magasin de données Google App Engine fournit-il un mécanisme similaire ou le problème de sélection N + 1 est-il quelque chose qui n'est plus pertinent sur cette plate-forme?Est-ce que GAE Datastore prend en charge la récupération ardue?
Répondre
Je pense que vous demandez implicitement si Google App Engine prend en charge JOIN pour éviter le problème de sélection N + 1.
Google App Engine ne prend pas en charge JOIN directement mais vous permet de définir un one to many relationship
en utilisant ReferenceProperty.
class Author(db.Model):
name = db.StringProperty()
class Book(db.Model):
title = db.StringProperty()
author= db.ReferenceProperty(Author)
Dans vous scénario spécifique, avec deux appels de requête, le premier à obtenir l'auteur:
author = Author.all.filter('name =' , 'fooauthor').get()
et le second pour trouver tous les livres d'un auteur donné:
books = Book.all().filter('author=', author).fetch(...)
vous pouvez obtenir le même résultat d'une requête SQL commune qui utilise JOIN.
Le N + 1 problème pourrait par exemple apparaître lorsque l'on veut obtenir 100 livres, chacun avec son nom de l'auteur:
books = Book.all().fetch(100)
for book in books:
print book.author.name
Dans ce cas, nous avons besoin d'exécuter 1 + 100 requêtes, un pour obtenir la liste des livres et 100 pour déréférencer tous les objets auteurs pour obtenir le nom de l'auteur (cette étape est implicitement effectuée sur l'instruction book.author.name
).
Une technique commune pour résoudre ce problème est à l'aide get_value_for_datastore
méthode qui récupère la clé de l'auteur fait référence d'un livre donné sans déréférencement (ie, un datastore fetch):
author_key = Book.author.get_value_for_datastore(book)
Il y a un blog post brillant sur ce sujet que vous pourriez vouloir lire.
Cette méthode, à partir de la liste author_key
, prélève les objets auteurs de la banque de données en définissant chacun d'eux dans le livre d'entités approprié.
Cette approche permet d'économiser beaucoup d'appels à la banque de données et pratiquement * évite le problème N + 1.
* théoriquement, sur une étagère avec 100 livres écrits par 100 auteurs différents, nous avons encore appeler le magasin de données 100 + 1 fois
répondre à votre question:
- Google App Engine fait ne supporte pas aller chercher désireux
- Il existe des techniques (pas de la boîte) qui permet d'éviter la redoutée N + 1 problème
- 1. Question Concurrence GAE Datastore
- 2. gae datastore backup
- 3. GAE Datastore Put()
- 4. GAE datastore liste propriété sérialisation
- 5. Accès au mécanisme de récupération si le site ne prend en charge que la connexion OpenID
- 6. Sous-requêtes sur Java GAE Datastore
- 7. Est-ce que omnicppcomplete prend en charge la syntaxe typedef
- 8. db.get() vs performances db.get_by_key_name() (GAe BIgtable/Datastore)
- 9. GAE Datastore - Réduire la chaîne de curseur (base 64) Longueur
- 10. JBoss prend en charge Websockets?
- 11. IE prend en charge JQuery
- 12. Est-ce que Dreamweaver 8 prend en charge l'intégration SVN?
- 13. Est-ce que MinGW prend en charge MFC?
- 14. Est-ce que Spring framework prend en charge Jersey API
- 15. Est-ce que J2ME prend en charge Apache Lucene?
- 16. Est-ce que Uploadify prend en charge jQuery 1.4?
- 17. Est-ce que .NET prend en charge AES OFB
- 18. Est-ce que LoadRunner 9.1 prend en charge WPF?
- 19. Est-ce que flot v0.5 prend en charge IE8 RTM?
- 20. est-ce que self.navigationItem.rightBarButtonItem prend en charge Array?
- 21. Est-ce que GWT 1.7 prend en charge Class.getSimpleName()?
- 22. Est-ce que GenerateScriptType prend en charge NonSerialized?
- 23. gae-sessions: sémantique des sessions de récupération par ID
- 24. Est-ce que Scaleform prend désormais en charge AS3?
- 25. Est-ce que IBM Websphere 5.1.2 prend en charge jstl
- 26. Est-ce que IIS Express prend en charge ASP Classic?
- 27. Est-ce que Imagick prend en charge les dégradés radiaux?
- 28. Est-ce que mysqli prend en charge ms sql?
- 29. Est-ce que Mono prend en charge Windows 64 bits?
- 30. Est-ce que Safari prend en charge l'application Objective-C?
Très bien, merci! Y a-t-il un 'ReferenceProperty' pour Java? –
@Jen jeter un oeil [ici] (http://code.google.com/intl/it-IT/appengine/docs/java/datastore/relationships.html#Owned_One_to_Many_Relationships) – systempuntoout