10

seguimiento a my earlier question regarding GAE Datastore entity hierarchies, todavía estoy confundido acerca de cuándo utilizar grupos de entidades.Cuándo utilizar grupos de entidades en el almacén de datos de GAE

Tome este sencillo ejemplo:

  • Cada Company tiene uno o más Employee entidades
  • Un Employee no se puede mover a otro Company, y los usuarios que tienen que ver con una Company nunca puede ver los Employee s de otra Company

Esto parece un caso en el que podía hacer Employee un entidad hijo de Company, pero ¿cuáles son las consecuencias prácticas? ¿Esto mejora la escalabilidad, perjudica la escalabilidad o no tiene ningún impacto? ¿Cuáles son otras ventajas/desventajas de usar o no una jerarquía de entidades?

(Los grupos de entidades permiten transacciones, pero asumen para este ejemplo que no necesito transacciones).

Respuesta

8

Nick dijo claramente que no debe hacer que los grupos sean más grandes de lo necesario, el Best practices for writing scalable applications tiene alguna discusión sobre por qué.

Use grupos de entidades cuando necesite transacciones. En el ejemplo que proporcionó, un empleado ReferenceProperty obtendrá un resultado similar.

Además de las transacciones, los grupos de entidades pueden ser útiles porque las capturas de teclas y las consultas se pueden descifrar de una entidad principal. Sin embargo, es posible que desee considerar multitenancy para estos tipos de casos de uso.

En última instancia, los grupos de entidades grandes pueden perjudicar la escalabilidad, las entidades dentro de un grupo de entidades se almacenan en la misma tableta. Cuantas más cosas acumule en un grupo de entidades, más reducirá la cantidad de trabajo que se puede hacer en paralelo; en su lugar, se necesita realizarlo en serie.

8

Si no necesita transacciones, no use grupos de entidades. Disminuyen las cosas en algunos casos, y nunca aceleran nada. Su único beneficio es que permiten transacciones.

Por lo que puedo decir, el mejor lugar para usar grupos de entidades es en datos a los que no es probable que accedan muchos usuarios al mismo tiempo, y que con frecuencia deseará incluir en una transacción. Por lo tanto, si almacenó los contenidos de un carrito de compras, que probablemente solo tratará con frecuencia el propietario de ese carrito, esos contenidos podrían ser buenos para un grupo de entidades; sería bueno poder usar una transacción para esos datos. cuando agregas o actualizas una entidad, y no estás bloqueando a nadie más cuando lo haces.

+8

el espíritu aquí es definitivamente correcto, y puedo revisar un poco los detalles técnicos. los grupos de entidades duelen la escalabilidad porque las escrituras se serializan por grupo de entidades, no porque sus datos se almacenen juntos. (la ubicación espacial a menudo es buena para almacenar en caché y escalar, dependiendo de los detalles de implementación.) dado que no se preocupe demasiado por el volumen de datos por grupo de entidades. Lo principal de lo que preocuparse es el rendimiento de escritura.como se observa en muchos otros lugares, no puede hacer más de 1 a 10 escrituras por segundo por grupo de entidades. – ryan

+3

Otro beneficio importante son las lecturas muy consistentes. Tal vez "permiten transacciones" implica esto, pero esto no fue inmediatamente claro para mí. – Chris

+0

@Chris Yup, en sí mismo, un EG permite lecturas consistentes con el uso de consultas de ancestros. Las transacciones son un concepto relacionado, pero son diferentes; las transacciones están destinadas a garantizar la atomicidad para operaciones múltiples (por ejemplo, una lectura más una escritura). Por cierto, hay una forma más de lograr lecturas muy consistentes para una entidad, que es realizar una búsqueda por clave. Esto requiere que sepas cuál es la clave en primer lugar sin "preguntar" al almacén de datos. https://cloud.google.com/datastore/docs/articles/balancing-strong-and-eventual-consistency-with-google-cloud-datastore/ –

Cuestiones relacionadas