Domanda

dire Let Voglio visualizzare un elenco di libri ei loro autori. Nella progettazione di database tradizionali, vorrei rilasciare una singola query per recuperare le righe della tabella Book così come il relativo tavolo Author, un passo noto come il recupero desiderosi . Questo viene fatto per evitare il temuto N + 1 select problema : Se i record Author sono stati recuperati pigramente, il mio programma avrebbe dovuto emettere una query separata per ogni autore, forse come molte domande come ci sono libri in la lista.

Google App Engine datastore fornire un meccanismo simile, o è la N + 1 select problema qualcosa che non è più rilevante su questa piattaforma?

È stato utile?

Soluzione

Penso che si sta implicitamente chiedendo se supporti Google App Engine si uniscono per evitare il N + 1 select problema .
Google App Engine non supporta ENTRA direttamente, ma consente di definire un one to many relationship utilizzando ReferenceProperty .

class Author(db.Model):
  name = db.StringProperty()

class Book(db.Model):
  title = db.StringProperty()
  author= db.ReferenceProperty(Author)

In ti scenario specifico, con due chiamate di query, il primo per ottenere l'autore:

author = Author.all.filter('name =' , 'fooauthor').get()

e la seconda per trovare tutti i libri di un determinato autore:

books = Book.all().filter('author=', author).fetch(...)

è possibile ottenere lo stesso risultato di un comune, SQL query che utilizza aderire.

N + 1 problema potrebbe ad esempio apparire quando vogliamo ottenere 100 libri, ognuno con il nome dell'autore:

books = Book.all().fetch(100)
for book in books:
    print book.author.name

In questo caso, abbiamo bisogno di eseguire 1 + 100 query, uno per ottenere la lista di libri e 100 per risolvere il riferimento tutti gli autori oggetti per ottenere il nome dell'autore (questo passaggio è implicitamente fatto su dichiarazione book.author.name).

Una tecnica comune per risolvere questo problema è quello di utilizzare il metodo get_value_for_datastore che recupera chiave dell'autore di riferimento di un dato libro senza dereferenziazione (vale a dire, un datastore fetch):

author_key = Book.author.get_value_for_datastore(book)

C'è un brillante post sul blog su questo argomento che si potrebbe desiderare di leggere.
Questo metodo, a partire dalla lista author_key, prefetch gli oggetti autori di archivio dati impostando ciascuno per il buon libro entità.
Usando questo approccio consente di risparmiare un sacco di chiamate al datastore e praticamente * evita il N + 1 problema.

* teoricamente, su uno scaffale con 100 libri scritti da 100 autori diversi, dobbiamo ancora chiamare il datastore 100 + 1 volte

rispondere alla tua domanda:

  • Google App Engine non supporta il recupero desiderosi
  • Ci sono tecniche (non fuori dalla scatola) che aiuta ad evitare il temuto N + 1 problema
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top