google-app-engine - español - google app engine que es
¿Cuál es el propósito de los antepasados en el almacén de datos del motor de la aplicación de Google? (3)
He estado jugando con el motor de aplicaciones de Google y su almacén de datos recientemente y he creado un modelo de datos y relaciones usando propiedades de referencia.
Sin embargo, no tengo claro el concepto de antepasados en el almacén de datos. ¿Cuál es su propósito y por qué debería usarlos? ¿Cómo se relacionan con las propiedades de referencia de las entidades del almacén de datos?
El ejemplo generalmente usado es un autor y sus libros.
Cada libro se almacena en el almacén de datos como una entidad separada, con su nombre y su autor almacenados como campos en el modelo.
Si desea conocer todos los libros de un solo autor, puede ejecutar una consulta tal que
book.author == desired_author
Pero con los antepasados también puede guardar cada libro y establecer un modelo (un nuevo modelo de autor) para que sea su padre (su antecesor).
Entonces, simplemente puede decir "muéstreme todos los libros que tengan este autor como padre".
O mejor dicho, "muéstrame a todos los hijos de este antepasado" y se devuelven todos los libros de ese autor.
Puede que no parezca útil en este ejemplo, pero si imagina en lugar de "autor", tiene "usuario" y en lugar de "libro" tiene "mensaje de tablero de mensajes" y decenas de miles de mensajes y, de repente, resulta muy útil ser capaz de encontrar todos los mensajes por usuario (por ejemplo, mostrar mis propios mensajes).
https://developers.google.com/appengine/docs/python/datastore/queryclass#Query_ancestor
ancestor (ancestor)
Adds an ancestor filter to the query. The query will return only entities with the specified ancestor.
También hay beneficios en los costos para encontrar cada registro que espero.
Otro beneficio de los grupos / antepasados de entidades es crear islas de consistencia fuerte (en contraposición a una consistencia eventual).
Por ejemplo, podría tener un proyecto y sus tareas. Sin ancestros, podría "cerrar" una tarea, volver a la pantalla de lista de tareas para el proyecto y realizar una consulta para las tareas abiertas. La tarea que acaba de cerrar podría seguir apareciendo debido a la coherencia final. La consulta puede haberse resuelto en un servidor donde la actualización aún no se ha replicado.
Sin embargo, con los ancestros obtienes una consistencia fuerte. Entonces, en lugar de una simple clave externa de tarea a proyecto, usted hace que el proyecto sea el antecesor para las tareas del proyecto. Ahora, cuando consulta por tareas, la convierte en una consulta ancestral al proporcionar también la clave del proyecto. El resultado será muy consistente y la tarea que acaba de cerrar nunca formará parte del resultado.
Proporcionar un antepasado hace que su (nueva) entidad sea parte del mismo grupo de entidades que el antepasado proporcionado. Por lo tanto, todas las entidades con una entidad raíz común como ancestro se almacenan en el mismo nodo de almacenamiento de datos, esta ''localidad'' permite realizar numerosas acciones en todas estas entidades (en el mismo grupo de entidades) dentro de una transacción. Luego, para cualquier consulta que contenga una consulta de ancestro (como solo las entidades de retorno que son secundarias la entidad raíz común), estas acciones parecerán ocurrir simultáneamente (atómicamente) o no aparecerán en absoluto.
Ref: http://www2.mta.ac.il/~kirsh/download/MTA%20NoSQL%20Seminar/Lectures/GAE.pdf