2009-09-04 5 views
11

Como ejemplo hipotético, tengo un modelo TodoItem y un modelo TodoList. Un TodoList tiene una lista ordenada de TodoItems, y cualquier TodoItem puede pertenecer a cualquier cantidad de Lista de Todo (Muchos a Muchos). No se debe almacenar ninguna otra información acerca de su relación que no sea el orden de un TodoItem en una lista TodoList. ¿Cuál es la mejor manera de representar esto en la tienda de datos?ListProperty de claves vs Many-to-Many en App Engine

Hay dos maneras de implementar esto - dar la clase ToDoList un ListProperty de db.Key de la cual se referirá a TodoItem de:

class TodoList(db.Model): 
    items = db.ListProperty(db.Key) 

o hacer un modelo ListItem que también contiene la información de pedido:

class TodoListItem(db.Model): 
    item = db.ReferenceProperty(TodoItem) 
    list = db.ReferenceProperty(TodoList) 
    order = db.IntegerProperty() 

Definitivamente voy a optimizar esto más adelante mediante la desnormalización de los modelos, pero la preoptimización, ¿tiene alguna representación una ventaja sobre la otra?

Respuesta

10

Esto depende de algunos factores:

  • ¿Es necesario para almacenar información acerca de la relación misma, con excepción de su pedido? Por ejemplo, muchos: muchos entre pedidos y productos necesitarían almacenar la cantidad de cada producto.
  • ¿Necesita asociar más de un millar de elementos del lado de la relación con una cardinalidad 'más pequeña' (por ejemplo,> 1000 elementos de todo o> 1000 listas para un elemento)?
  • ¿Normalmente desea recuperar todos los elementos asociados a la vez o prefiere ser más selectivo?

Si necesita información adicional, o tiene muchos elementos en su asociación, o solo necesita recuperar algunos de ellos, la entidad de relación es probablemente una mejor opción. En otras situaciones, la lista puede ser más fácil y más rápida. En el caso de una lista de tareas pendientes, diría que una lista de claves es definitivamente la mejor manera de hacerlo.

1

Excepto en un contexto relacional donde uno está presionando para la normalización (¡bastante aconsejable en el caso relacional, por supuesto!) La "clase de relación" TodoListItem separada me parece un poco exagerada, y algo "forzada" en términos de la forma en que uno razona sobre el problema versus la manera en que uno lo codifica. Sin embargo, en términos de optimización, ciertamente haría más fácil encontrar todas las listas en las que se encuentra un artículo.

0

Dado que TodoListItem puede pertenecer a múltiples listas de elementos, me preocuparía que sea válido tener una propiedad de orden única que funcione para cada lista a la que pertenece el elemento. Pensaría que el artículo necesitaría una orden para cada lista a la cual pertenece.