2011-11-23 114 views
5

我讀this page但沒有得到何時使用嵌入功能以及何時使用linking.I在Django的一個項目裏面我是用我的MongoDB.In文件models.py我有以下型號:嵌入Vs在MongoDB.When中嵌入鏈接和何時鏈接?

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) 

我的問題是,如果我們不這樣做嵌入我們必須更新所有models.Like的對象,如果我想更新「用戶」的名義,我將不得不運行模式更新:項目,團隊,用戶和任務或者鏈接在我的情況下會更好?

回答

3

首先,在概念上,將模型類命名爲單數對象。

用戶應用戶,團隊應該是團隊...

認爲模型從多個對象將要進行的模具。用戶模型將生成用戶並存儲在名爲用戶的表中,其中每個文檔/行都是用戶對象。現在

,關於你的問題,hymloth是完全正確的。使其成爲文檔而不是嵌入文檔的參考的方法是將這些特定字段更改爲引用用戶集合中用戶的ID。這樣,你只需要存儲一個id來查找,而不是用戶文檔的副本。當您更改參考文檔時,它也會在所有引用的位置進行更改。 (典型的關係協會)

我沒有看到一個字段,在Django的MongoDB中要麼但也許你可以使用傳統的Django ForeignKey的領域用於此目的。我不知道你是否可以混合搭配,所以給它一個鏡頭。

例如,你的團隊的類將有一個字段是這樣的:

teamLeader = ForeignKey(User) 

讓我知道是否可行。

4

在你的榜樣,是的,改變一個用戶的名字所暗示的,如果你使用的嵌入,那麼你必須更新的額外步驟的所有其他文件。在你的情況下更適合的是鏈接(引用)。這涉及到查詢時的額外步驟,但由於您的特定「業務邏輯」,它更好。

一般情況下,如果給定的文件需要從許多不同的地方訪問的話很有道理,使其參考,而不是嵌入。這同樣適用於文檔頻繁更改的情況。

+0

你能告訴我一個例子嗎?我會感謝你:) – Anshul

+0

只需用ReferenceField('Users')替換所有EmbeddedModelField('用戶')。 – hymloth

+0

但我使用的是Django-mongoDB引擎,它沒有像ReferenceField這樣的字段。 :( – Anshul