update google google-app-engine hierarchical-data google-cloud-datastore

google-app-engine - google - datastore get entity java



¿Almacenar datos jerárquicos en Google App Engine Datastore? (3)

¿Alguien puede ilustrar cómo puedo almacenar y consultar fácilmente los datos jerárquicos en el almacén de datos del motor de la aplicación de Google?


Bueno, deberías tratar de mantener tus datos lo más lineales posible. Si necesita consultar rápidamente una estructura de árbol de datos, tendrá que almacenarla encuadrada en la base de datos (o codificada en JSON si lo prefiere) si eso es posible para sus datos, o tendría que generar índices de árbol que puedan ser utilizado para consultar rápidamente una pieza de una estructura de árbol. Sin embargo, no estoy seguro de cómo Google App Engine funcionaría al actualizar esos índices.

Cuando se trata de Google App Engine, su principal preocupación debe ser reducir el número de consultas que necesita realizar y que sus consultas regresen lo menos posible. Las operaciones son costosas, pero el almacenamiento no lo es, por lo que la redundancia no debe verse como algo malo.

Aquí hay algunas reflexiones sobre el tema que encontré en Google (aunque para MySQL, pero puede obtener una idea general del mismo): Gestión de datos jerárquicos en MySQL

Ah, y esta es una discusión para Google App Engine: Modelado de datos jerárquicos


La mejor opción depende de tus requisitos. Aquí hay algunas soluciones (supongo que está usando Python, ya que no especificó):

  1. Si necesita realizar actualizaciones transaccionales en un árbol completo, y no va a tener más de aproximadamente 1QPS de actualizaciones continuas para un árbol en particular, puede usar el soporte integrado para almacenamiento jerárquico. Al crear una entidad, puede pasar el atributo "principal" para especificar una entidad o clave principal, y al consultar, puede usar el método .ancestor () (o ''ANCESTOR IS'' en GQL para recuperar todos los descendientes de una entidad dada .
  2. Si no necesita actualizaciones transaccionales, puede replicar la funcionalidad de grupos de entidades sin los problemas de contención (y seguridad de la transacción): Agregue una propiedad db.ListProperty (db.Key) a su modelo llamado ''ancestros'', y rellene con la lista de antepasados ​​del objeto que está insertando Luego puede recuperar fácilmente todo lo que desciende de un ancestro determinado con MyModel.all (). Filter (''ancestros ='', parent_key).
  3. Si no necesita transacciones, y solo se preocupa por recuperar los hijos directos de una entidad (no todos los descendientes), utilice el método descrito anteriormente, pero en lugar de una propiedad de lista simplemente use una propiedad de referencia para la entidad principal. Esto se conoce como Lista de adyacencia.

Hay otros enfoques disponibles, pero esos tres deberían cubrir los casos más comunes.


Una forma es usar el atributo principal del Modelo. Luego puede hacer uso de las funciones query.ancestor () y model.parent ().

Supongo que depende de qué tipo de operaciones quieras hacer con estos datos, lo que determinaría la mejor manera de representarlo.