2011-11-23 17 views
5

leí this page pero no consiguió cuándo utilizar característica de inserción y cuándo usar linking.I tener un proyecto en Django para el que estoy usando mi archivo MongoDB.In models.py tengo siguientes modelos:Incrustar Vs Vincular en MongoDB.when para incrustar y cuándo vincular?

class Projects(models.Model): 
    projectName =models.CharField(max_length = 100,unique=True,db_index=True) 
    projectManager = EmbeddedModelField('Users') 

class Teams(models.Model): 
    teamType = models.CharField(max_length =100) 
    teamLeader = EmbeddedModelField('Users') 
    teamProject = EmbeddedModelField('Projects') 
    objects = MongoDBManager() 

class Users(models.Model): 
    name = models.CharField(max_length = 100,unique=True) 
    designation = models.CharField(max_length =100) 
    teams = ListField(EmbeddedModelField('Teams')) 



class Tasks(models.Model): 
    title = models.CharField(max_length = 150) 
    description = models.CharField(max_length=1000) 
    priority = models.CharField(max_length=20) 
    Status = models.CharField(max_length=20) 
    assigned_to = EmbeddedModelField('Users') 
    assigned_by = EmbeddedModelField('Users') 
    child_tasks = ListField() 
    parent_task = models.CharField(max_length = 150) 

Mi pregunta es si hacemos incrustación si tenemos que actualizar el objeto en todos los modelos. Como si quisiera actualizar el nombre de un 'usuario', tendría que ejecutar la actualización para los modelos: proyectos, equipos, usuarios y tareas o la vinculación sería mejor en mi caso?

Respuesta

3

Primero, conceptualmente, nombre sus clases modelo como objetos singulares.

Los usuarios deben ser de uso, los equipos deben estar Equipo ...

Piense en el modelo como el molde a partir del cual se harán varios objetos. El modelo de usuario generará usuarios y se almacenará en una tabla llamada Usuarios donde cada documento/fila es un objeto Usuario.

Ahora, con respecto a su pregunta, hymloth es exactamente correcto. La forma de hacer que sea una referencia a un documento en lugar de a uno incrustado es cambiar esos campos particulares para hacer referencia a la identificación de un usuario en la colección del usuario. De esta forma, solo está almacenando una identificación para buscar en lugar de una copia del documento de usuario. Cuando cambie el documento de referencia, se cambiará también en todos los lugares a los que se hace referencia. (Asociación relacional típica)

No vi un campo para eso en Django-mongoDB tampoco, pero tal vez pueda usar el campo tradicional ForeignKey de django para este propósito. No sé si puedes mezclar y combinar, así que pruébalo.

por ejemplo, la clase de equipos tendrían un campo como este:

teamLeader = ForeignKey(User) 

Avísame si funciona.

4

En su ejemplo, sí, cambiar el nombre de un usuario implica que si utiliza la incrustación, debe actualizar todos los demás documentos con un paso adicional. Lo que es más apropiado en su situación es vincular (hacer referencia). Esto implica un paso adicional en el tiempo de consulta, pero debido a su particular "lógica comercial", es mejor.

En general, si se debe acceder a un documento determinado desde diferentes lugares, tiene sentido hacerlo referencia en lugar de incrustado. Lo mismo aplica en situaciones cuando un documento cambia frecuentemente.

+0

¿me puede mostrar un ejemplo? te agradecería :) – Anshul

+0

Simplemente reemplaza todos tus EmbeddedModelField ('Usuarios') con un Campo de Referencia ('Usuarios'). – hymloth

+0

Pero estoy usando el motor Django-mongoDB y no tiene campos como ReferenceField. :( – Anshul