Todavía estoy aprendiendo mis lecciones sobre modelado de datos en bigtable/nosql y agradecería algunos comentarios. ¿Sería justo decir que debo evitar las relaciones entre padres e hijos en mi modelado de datos si con frecuencia necesito tratar con los niños en conjunto entre los padres?relaciones padre-> hijo en appengine python (bigtable)
Como ejemplo, digamos que estoy compilando un blog al que contribuirá un número de autores, y cada uno tiene publicaciones, y cada publicación tiene etiquetas. Así que potencialmente podría configurar algo como esto:
class Author(db.Model):
owner = db.UserProperty()
class Post(db.Model):
owner = db.ReferenceProperty(Author,
collection_name='posts')
tags = db.StringListProperty()
Según tengo entendido, esto creará un grupo de entidades basado en el autor padre. ¿Esto causa ineficacia si la mayoría de las veces necesito consultar las Publicaciones por etiquetas que espero cortar entre varios Autores?
Entiendo que hacer una consulta en las propiedades de la lista puede ser ineficiente. Digamos que cada publicación tiene aproximadamente 3 etiquetas en promedio, pero podría llegar hasta 7. Y espero que mi colección de posibles etiquetas esté en los cientos más bajos. ¿Hay algún beneficio en alterar ese modelo a algo como esto?
class Author(db.Model):
owner = db.UserProperty()
class Post(db.Model):
owner = db.ReferenceProperty(Author,
collection_name='posts')
tags = db.ListProperty(db.Key)
class Tag(db.Model):
name = db.StringProperty()
O ¿sería mejor hacer algo como esto?
class Author(db.Model):
owner = db.UserProperty()
class Post(db.Model):
owner = db.ReferenceProperty(Author,
collection_name='posts')
class Tag(db.Model):
name = db.StringProperty()
class PostTag(db.Model):
post = db.ReferenceProperty(Post,
collection_name='posts')
tag = db.ReferenceProperty(Tag,
collection_name='tags')
Y la última pregunta ... ¿y si mi caso de uso más común será la consulta de los mensajes de múltiples etiquetas. Por ejemplo, "buscar todas las publicaciones con etiquetas en {'manzanas', 'naranjas', 'pepinos', 'bicicletas'}" Es uno de estos enfoques más apropiado para una consulta que busca publicaciones que tienen una colección de etiquetas ?
Gracias, sé que fue un bocado. :-)
Ninguno de sus ejemplos crea grupos de entidades. En el primer ejemplo, está utilizando una propiedad de referencia, que crea una referencia a la otra entidad; esto es mutable y no implica propiedad. Las referencias principales se crean especificando el argumento "principal" para el constructor de la entidad; consulta esta página para obtener más información: http://code.google.com/appengine/docs/python/datastore/entities.html#Entity_Groups_and_ Ancestro_de_asuntos –
Ah, gracias Nick Me faltaba esa parte ... pensé que eran las referencias las que creaban la relación principal y faltaba que necesitaras pasar el padre al constructor. Eso tiene sentido ahora. –