Implicaciones de GAE de la jerarquía NDB y grupos de entidades

Estoy tratando de comprender mejor las implicaciones de la jerarquía profunda descrita en los documentos GAE NDB

“Por ejemplo, una revisión de un mensaje que” pertenece a “un propietario, podría tener una clave que parece”

rev_key = ndb.Key('Account', 'Sandy', 'Message', 'greeting', 'Revision', '2') 

Interpreto que esto significa que si hago Revision(parent=rev_key).put() entonces tendré un grupo de entidades en el nivel de Revision = 2 que significa consultas de ancestor=rev_key donde ancestor=rev_key tendrá una consistencia sólida y escribirá donde parent=rev_key estar limitado a 1 / seg.

¿Pero cuáles son las implicaciones más arriba en la jerarquía?

Por ejemplo, digamos que tengo

 rev_key_B = ndb.Key('Account', 'Sandy', 'Message', 'greeting', 'Revision', '3') 

¿La velocidad de escritura está limitada a 1 / seg en el nivel rev_key_B o, dado que comparten el padre de un padre, es decir, ndb.Key('Account', 'Sandy', 'Message', 'greeting') , la velocidad de escritura está limitada aún más arriba la ruta del antepasado y, en última instancia, a todo el grupo de entidades hasta ndb.Key('Account', 'Sandy') ?

Las mismas preguntas son: consistencia fuerte. ¿ Revision.query(ancestor=ndb.Key('Account', 'Sandy', 'Message', 'greeting')) tiene una consistencia fuerte?

Veamos

 rev_key = ndb.Key('Account', 'Sandy', 'Message', 'greeting', 'Revision', '2') 

Significa que cada entidad tiene una consistencia fuerte siguiendo la ruta de la entidad. Así que tienes razón.

Vamos a verlo en acción: crear las entidades.

 account_sandy = Account.get_or_insert('Sandy') sandy_message = Message.get_or_insert('greeting', parent=account_sandy.key) sandy_message_rev = Revision.get_or_insert('2', parent=sandy_message.key) 

Eso le dará una gran consistencia y le otorgará la posibilidad de consultar también todas las entidades anteriores dentro de las transacciones.

Estoy usando get_or_insert que hace lo que dice dentro de una transacción, creando una entidad de manera eficiente si no existe con la clave proporcionada. Esto requiere que la clave o la identificación sean únicas. Así que de esta manera no puedes tener 2 mensajes con Greeting y Sandy as parent .

La forma en que funcionan las teclas es como un árbol binario.

S = Sandy, M = Mensaje, R = Revisión

  Sandy / | \ M1 M2 M3 / | \ | \ R1 R2 R1 R1 R2 

Cada ruta al final o más corta se puede ejecutar en la transacción y proporcionar una consistencia sólida *.

Responder en el comentario:

Como este ejemplo no es suficiente para mostrar la eficiencia de GAE y NDB, tal vez lo haga a continuación.

Imagina que tienes un jukebox con colas por habitación, digamos. Y la gente hace colas en cada cola de cada jukebox.

J = Jukebox, Q = cola, S = Song

  Jukebox / | \ Q1 Q2 Q3 / | \ | \ S1 S2 S3 S4 S5 

En este ejemplo, es conveniente utilizar rutas, por lo que cada operación por parte de un usuario, sabiendo qué jukebox, puede poner en cola la entidad de la canción con coherencia para jukebox, cola y canción.

* Por cierto, también puedes bloquear rutas que no se inician desde la raíz

También tenga en cuenta que las consultas dentro de las transacciones deben incluir filtros de antepasados