tutorial pricing informacion google gae espaƱol engine app python google-app-engine bigtable data-modeling

python - pricing - Asesoramiento de modelado de datos para el sistema de etiquetado de blogs en Google App Engine



google app engine python (4)

Me pregunto si alguien podría proporcionar algún consejo conceptual sobre una forma eficiente de construir un modelo de datos para lograr el sistema simple que se describe a continuación. Soy algo nuevo para pensar de una manera no relacional y quiero intentar evitar cualquier trampa obvia. Tengo entendido que un principio básico es que "el almacenamiento es barato, no se preocupe por la duplicación de datos" como podría hacerlo en un RDBMS normalizado.

Lo que me gustaría modelar es:

Un artículo de blog que puede recibir etiquetas 0-n. Muchos artículos de blog pueden compartir la misma etiqueta. Al recuperar datos, le gustaría permitir la recuperación de todos los artículos que coinciden con una etiqueta. En muchos sentidos, muy similar al enfoque adoptado aquí en stackoverflow.

Mi mentalidad normal sería crear una relación de varios a muchos entre etiquetas y artículos de blog. Sin embargo, estoy pensando en el contexto de GAE que esto sería costoso, aunque he visto ejemplos de esto.

¿Tal vez usando una ListProperty que contenga cada etiqueta como parte de las entidades del artículo, y un segundo modelo de datos para rastrear etiquetas a medida que se agregan y eliminan? De esta forma, no hay necesidad de ninguna relación y ListProperty aún permite consultas en las que cualquier comparación de elemento de lista arrojará resultados.

¿Alguna sugerencia sobre la forma más eficiente de abordar esto en GAE?


Muchos-a-muchos suena razonable. Tal vez deberías probarlo primero para ver si realmente es costoso.

Lo bueno de GAE es que te dirá cuándo estás usando demasiados ciclos. ¡Perfilando gratis!


Una posible forma es con Expando , donde agregarías una etiqueta como:

setattr(entity, ''tag_''+tag_name, True)

Entonces podrías consultar todas las entidades con una etiqueta como:

def get_all_with_tag(model_class, tag): return model_class.all().filter(''tag_%s ='' % tag, True)

Por supuesto, debe limpiar sus etiquetas para que sean los identificadores adecuados de Python. No lo he intentado, así que no estoy seguro de si realmente es una buena solución.


Gracias a ambos por sus sugerencias. Implementé (primera iteración) de la siguiente manera. No estoy seguro de si es el mejor enfoque, pero está funcionando.

Clase A = Artículos. Tiene una StringListProperty que se puede consultar en sus elementos de lista

Clase B = Etiquetas. Una entidad por etiqueta, también mantiene una cuenta corriente de la cantidad total de artículos que usan cada etiqueta.

Las modificaciones de los datos a A van acompañadas de un trabajo de mantenimiento en B. Pensar que contar es precomputado es un buen enfoque en un entorno de lectura pesada.


los recuentos que se están precalculando no solo son prácticos , sino también necesarios porque la función count () devuelve un máximo de 1000 . si la contención de escritura puede ser un problema, asegúrese de verificar el ejemplo del contador fragmentado.

http://code.google.com/appengine/articles/sharding_counters.html