2011-11-23 8 views
5

Ho letto this page ma non ha ottenuto quando usare funzione incorporamento e quando utilizzare linking.I avere un progetto in Django per il quale sto usando MongoDB.In mio file models.py devo seguenti modelli:Incorporamento Vs Collegamento in MongoDB.quando inserire e quando collegare?

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) 

La mia domanda è se facciamo l'incorporamento dobbiamo aggiornare l'oggetto in tutti i modelli. Se desidero aggiornare il nome di un 'utente', dovrei eseguire l'aggiornamento per i modelli: progetti, team, utenti e attività o il collegamento sarebbe migliore nel mio caso?

risposta

3

Primo, concettualmente, denominare le classi modello come oggetti singolari.

Gli utenti dovrebbero essere di facile uso, Squadre dovrebbe essere della squadra ...

Pensate del modello come lo stampo da cui saranno resi più oggetti. Il modello utente produrrà gli utenti e verrà memorizzato in una tabella denominata Utenti in cui ogni documento/riga è un oggetto Utente.

Ora, per quanto riguarda la tua domanda, hymloth ha esattamente ragione. Il modo per renderlo un riferimento a un documento invece di uno incorporato è quello di modificare quei particolari campi per fare riferimento all'ID di un utente nella collezione dell'utente. In questo modo stai semplicemente memorizzando un ID da cercare al posto di una copia del documento dell'utente. Quando si modifica il documento di riferimento, verrà modificato in tutti i punti a cui viene fatto riferimento. (Tipica associazione relazionale)

Non ho visto un campo per quello in Django-mongoDB, ma forse puoi usare il tradizionale campo django ForeignKey per questo scopo. Non so se riesci a mescolare e abbinare così da provarlo.

per esempio, la classe squadre hanno un campo come questo:

teamLeader = ForeignKey(User) 

fatemi sapere se funziona.

4

Nell'esempio, sì, la modifica del nome di un utente implica che se si utilizza l'incorporamento, è necessario aggiornare tutti gli altri documenti con un passaggio aggiuntivo. Ciò che è più appropriato nella tua situazione è il collegamento (referenziamento). Ciò comporta un ulteriore passaggio al tempo di interrogazione, ma a causa della tua particolare "logica aziendale", è meglio.

In genere, se è necessario accedere a un determinato documento da un numero di posizioni diverse, è opportuno renderlo un riferimento anziché incorporato. Lo stesso vale in situazioni in cui un documento cambia frequentemente.

+0

puoi mostrarmi un esempio? ti sarei grato :) – Anshul

+0

Sostituisci semplicemente tutti i tuoi EmbeddedModelField ('Utenti') con un ReferenceField ('Utenti'). – hymloth

+0

Ma sto usando il motore Django-mongoDB e non ha campo come ReferenceField. :( – Anshul

Problemi correlati