2012-08-07 4 views
5

Nel datastore di replica alta (sto utilizzando NDB), la coerenza è finale. Per ottenere un set completo garantito, è possibile utilizzare le query degli antenati. Le query di Ancestor forniscono anche un ottimo modo per ottenere tutti i "figli" di un particolare antenato con domande senza gentilezza. In breve, essere in grado di sfruttare il modello degli antenati è estremamente utile in GAE.Come modificare l'antenato di un record NDB?

Il problema che sembro avere è piuttosto semplicistico. Diciamo che ho un record di contatto e un record di messaggio. Un dato record di contatto viene considerato come l'antenato di ciascun messaggio. Tuttavia, è possibile che vengano creati due contatti per la stessa persona (errore dell'utente, diversi punti di dati, qualsiasi cosa). Questa situazione produce due record di contatti, che contengono messaggi ad essi correlati.

Ho bisogno di essere in grado di "unire" i due record e portare tutti i messaggi in una grande pila. Idealmente, sarei in grado di modificare l'antenato per uno dei figli del record.

L'unico modo che posso pensare di fare questo, è creare una mappatura e fare controllare la mia app per vedere se il record è stato unito. In tal caso, esaminare le associazioni per trovare uno o più record correlati ed eseguire query su tali. Questo sembra estremamente inefficiente. C'è altro modo per "gestire il libro" di gestire questo caso d'uso?

+0

A me sembra che dipenda da come si presenta la tua datamodel. come decidi se è necessario unire 2 record? – aschmid00

+0

Buona domanda: dato che è in una fase di pensiero, assumiamo l'input dell'utente. – Sologoub

+0

quindi, se si desidera unire in base a un campo specifico di userinput (diciamo mail), si interroga prima il datastore e si vede se esiste già un record con quell'email e si passa da lì. se l'app è nuova e non disponi già di record, ti suggerisco di creare il record con il nome chiave/id basato sull'e-mail per poter interrogare tramite id. – aschmid00

risposta

9

L'unico modo per modificare l'antenato di un'entità è eliminare quello vecchio e crearne uno nuovo con una nuova chiave. Questo deve essere fatto per tutte le entità figlio (e nipote, ecc.) Nel percorso degli antenati. Se questo non è possibile, allora la soluzione elencata funziona.

Questo è necessario perché il percorso dell'antenato di un'entità è parte della sua chiave univoca. I genitori di entità (ad es. Entità nel percorso degli antenati) non devono necessariamente esistere, quindi la modifica della chiave di un genitore lascerà i bambini nell'archivio dati senza genitore.

+0

Grazie. Speravo in una soluzione più efficiente, ma questo ha perfettamente senso. – Sologoub