2011-11-23 2 views
5

나는 this page을 읽을 수는 있지만 내가 MongoDB.In 내 models.py 파일을 사용하고있는 경우 장고의 프로젝트가 linking.I을 사용하는 기능을 내장 사용하는 경우하지 않았다 나는 다음과 같은 모델이 있습니다Embedding Vs MongoDB에 링크. 임베드 할 때와 링크 할시기?

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) 

내 질문에 임베디드 할 경우 모든 모델에서 개체를 업데이트해야합니다. '사용자'의 이름을 업데이트하려는 경우 모델, 프로젝트, 팀, 사용자 및 작업에 대한 업데이트를 실행해야합니다. 제 경우에는 연결이 더 좋을까요?

답변

3

먼저 개념적으로 모델 클래스를 단일 개체로 명명하십시오.

사용자 ... 팀은 팀이어야한다, 사용자 수 여러 개체가 이루어집니다되는 금형과 같은 모델의

생각해야한다. 사용자 모델은 사용자를 생성하고 각 문서/행이 사용자 개체 인 사용자라는 테이블에 저장됩니다.

이제 귀하의 질문에 관해서는, hymloth가 정확합니다. 삽입 된 문서 대신 문서에 대한 참조로 만드는 방법은 특정 필드를 변경하여 사용자의 컬렉션에있는 사용자의 ID를 참조하는 것입니다. 그렇게하면 사용자 문서 복사본 대신 조회 할 ID를 저장하는 것입니다. 참조 문서를 변경하면 해당 참조 문서도 참조되는 모든 위치에서 변경됩니다. (대표적인 관계 협회)

Django-mongoDB에서 필드를 볼 수 없었지만이 목적으로 전통적인 django ForeignKey 필드를 사용할 수 있습니다. 믹스와 매치가 가능한지 잘 모르겠습니다.

는 예를 들어, 팀 클래스는 다음과 같은 필드있을 것입니다 :

teamLeader = ForeignKey(User) 

가 작동하는지 알려주세요.

4

예에서 사용자 이름을 변경하면 포함을 사용하는 경우 다른 모든 문서를 추가 단계로 업데이트해야한다는 것을 의미합니다. 귀하의 상황에 더 적합한 것은 연결 (참조)입니다. 여기에는 쿼리 시간에 추가 단계가 필요하지만 특정 "비즈니스 논리"로 인해 더 좋습니다.

일반적으로 지정된 문서를 여러 다른 위치에서 액세스해야하는 경우 포함되지 않고 참조로 지정하는 것이 좋습니다. 문서가 자주 변경되는 경우에도 마찬가지입니다.

+0

나에게 예제를 보여줄 수 있습니까? 나는 당신에게 감사 할 것이다 : – Anshul

+0

그냥 모든 귀하의 EmbeddedModelField ('사용자')를 ReferenceField ('사용자')로 바꿉니다. – hymloth

+0

그러나 Django-mongoDB 엔진을 사용 중이며 ReferenceField와 같은 필드가 없습니다. : – Anshul