Domanda

Qualcuno può illustrare come posso archiviare e interrogare facilmente i dati gerarchici nell'archivio dati del motore di app di Google?

È stato utile?

Soluzione

L'opzione migliore dipende dalle tue esigenze. Ecco alcune soluzioni (suppongo che tu stia utilizzando Python, dal momento che non hai specificato):

  1. Se è necessario eseguire aggiornamenti transazionali su un intero albero e non si avrà più di circa 1QPS di aggiornamenti sostenuti su un singolo albero, è possibile utilizzare il supporto integrato per l'archiviazione gerarchica. Quando crei un'entità, puoi passare il " parent " attributo per specificare un'entità o una chiave padre e, durante l'interrogazione, è possibile utilizzare il metodo .ancestor () (o "ANCESTOR IS" in GQL per recuperare tutti i discendenti di una determinata entità.
  2. Se non hai bisogno di aggiornamenti transazionali, puoi replicare la funzionalità dei gruppi di entità senza i problemi di contesa (e la sicurezza delle transazioni): aggiungi un db.ListProperty (db.Key) al tuo modello chiamato "antenati" e popola con l'elenco degli antenati dell'oggetto che stai inserendo. Quindi puoi facilmente recuperare tutto ciò che è disceso da un dato antenato con MyModel.all (). Filter ('ancestors =', parent_key).
  3. Se non hai bisogno di transazioni e ti interessa solo recuperare i figli diretti di un'entità (non tutti i discendenti), usa l'approccio descritto sopra, ma invece di ListProperty usa solo ReferenceProperty per l'entità padre. Questo è noto come un elenco di adiacenza.

Esistono altri approcci disponibili, ma questi tre dovrebbero coprire i casi più comuni.

Altri suggerimenti

Bene, dovresti cercare di mantenere i tuoi dati il ??più lineari possibile. Se è necessario eseguire una query rapida su una struttura ad albero di dati, è necessario archiviarlo in modalità decapata nel database (o codificato JSON se si preferisce) se ciò è possibile per i propri dati, oppure si dovrebbero generare indici ad albero che possono essere utilizzato per interrogare rapidamente un pezzo di una struttura ad albero. Tuttavia, non sono sicuro del rendimento di Google App Engine durante l'aggiornamento di tali indici.

Quando si tratta di Google App Engine, la preoccupazione principale dovrebbe essere quella di ridurre il numero di query che è necessario effettuare e che le query restituiscano il minor numero di righe possibile. Le operazioni sono costose, ma l'archiviazione no, quindi la ridondanza non dovrebbe essere vista come una cosa negativa.

Ecco alcuni pensieri sull'argomento che ho trovato su Google (anche se per MySQL, ma puoi ricavarne l'idea generale): Gestione dei dati gerarchici in MySQL

Ah ed ecco una discussione per Google App Engine: Modellazione di dati gerarchici

Un modo è usare l'attributo parent del Modello. È quindi possibile utilizzare le funzioni query.ancestor () e model.parent ().

Immagino che dipenda dal tipo di operazioni che vuoi fare su questi dati che determinerebbero il modo migliore per rappresentarlo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top