2012-08-07 19 views
5

En el Datastore de alta replicación (estoy usando NDB), la coherencia es eventual. Para obtener un conjunto completo garantizado, se pueden usar consultas de ancestros. Las consultas de ancestros también proporcionan una excelente manera de obtener todos los "hijos" de un ancestro en particular con consultas sin bondad. En resumen, ser capaz de aprovechar el modelo ancestro es de gran utilidad en GAE.¿Cómo cambiar el antecesor de un registro NDB?

El problema que parece tener es bastante simplista. Digamos que tengo un registro de contacto y un registro de mensaje. Un registro de contacto determinado se trata como el ancestro de cada mensaje. Sin embargo, es posible que se creen dos contactos para la misma persona (error de usuario, diferentes puntos de datos, lo que sea). Esta situación produce dos registros de contacto, que tienen mensajes relacionados con ellos.

Necesito poder "fusionar" los dos registros, y poner todos los mensajes en una pila grande. Idealmente, podría modificar el antecesor para uno de los hijos del registro.

La única forma en que puedo pensar en hacer esto, es crear una asignación y hacer que mi aplicación verifique si el registro se ha fusionado. Si es así, mira las asignaciones para encontrar uno o más registros relacionados y realiza consultas contra ellos. Esto parece muy ineficiente. ¿Hay más de la manera "por el libro" de manejar este caso de uso?

+0

me parece que dependerá de cómo se vea tu modelo de datos. ¿cómo se decide si se deben fusionar 2 registros? – aschmid00

+0

Buena pregunta, ya que esto está en una etapa de reflexión, supongamos que el usuario ingresó. – Sologoub

+0

así que si desea fusionar en función de un campo específico de la entrada de usuario (digamos correo), consulte primero el almacén de datos y vea si ya existe un registro con ese correo electrónico y continúe desde allí. si la aplicación es nueva y no tiene registros, entonces le sugiero que cree el registro con el nombre de clave/ID basado en el correo electrónico para poder consultar por identificación. – aschmid00

Respuesta

9

La única forma de cambiar el antecesor de una entidad es eliminar la antigua y crear una nueva con una nueva clave. Esto se debe hacer para todas las entidades secundarias (y nietas, etc.) en la ruta ancestral. Si esto no es posible, entonces su solución lista funciona.

Esto es necesario porque la ruta del ancestro de una entidad es parte de su clave única. No es necesario que los padres de las entidades (es decir, las entidades en la ruta del ancestro) existan, por lo tanto, al cambiar la clave de uno de los padres, los dejarán en el almacén de datos sin padre.

+0

Gracias. Esperaba una solución más eficiente, pero tiene mucho sentido. – Sologoub

Cuestiones relacionadas