2013-10-21 2 views
1

메신저는 거대한 형태를 채우기 위해 사용되는 응용 프로그램을 개발합니다. 양식이 속할 수있는 몇 가지 프로젝트가 있습니다. 또한 양식에는 목표 및 활동과 같이 여러 번 채울 수있는 두 개의 섹션이 있으므로 양식에 많은 목표와 활동을 정의 할 수 있습니다.ZODB 다중 객체 참조

나는 프로젝트를 대표하는 학급이 있으며, 다른 하나는 형식을 표현하고 두 개의 간단한 수업은 목적과 활동을 나타냅니다. 프로젝트에는 양식 목록이 있으며 양식에는 활동 및 목표 목록이 있습니다.

class Project(persistent.Persistent): 
    forms = PersistentList() 
    ... 

class Form(persistent.Persistent): 
    objectives = PersistentList() 
    activities = PersistentList() 
    ... 

내 질문은 다음과 같이 ZODB이 데이터를 저장하기에 메신저 계획이다

db['projects'] = OOBTree() 
db['forms']  = OOBTree() 
db['activities'] = OOBTree() 
db['objectives'] = OOBTree() 

project = Project(...)//fill data with some parameters 
form = Form(...)//fill data with some parameters 

objective1 = Objective(...) 
objective2 = Objective(...) 
activity1 = Activitiy(...) 
activity2 = Activitiy(...) 

form.addObjective(objective1) 
form.addObjective(objective2) 
form.addActivity(activity1) 
form.addActivity(activity2) 

project.addForm(form) 

db['projects']['projectID'] = project 
db['forms']['formID'] = form 
db['activities']['activityID'] = activity1 
db['activities']['activityID'] = activity2 
db['objectives']['objectiveID'] = objective1 
db['objectives']['objectiveID'] = ojective2 

transaction.commit() 

내가 프로젝트를 저장할 때, 형태의 목록뿐만 아니라 지속됩니다 것을 알고, 해당 목록 양식의 목표와 활동도

하지만 다른 OOBTrees, 'forms', 'activities'및 'objectives'의 경우 어떻게됩니까? 이 작업은 개인 양식/목표/활동을 쉽게 트래버스하거나 찾기 위해 수행됩니다. 하지만 ZODB가 이러한 개체를 캐시하고 프로젝트를 저장할 때 한 번만 유지하고 해당 개체에 대한 참조를 유지하는지 확신 할 수 없습니다. 따라서 이들 중 하나가 수정되면 모든 참조가 업데이트됩니다. 수행 할 때 db [ 'forms'] [ 'formID'] = 양식 OOBTree는 OOBTree 프로젝트와 동일한 개체를 가리키고 동일한 개체를 두 번 유지하지 않습니다. 그것이 작동하는 방식입니까? 중복 된 지속 객체를 얻고 모두 독립적 인 인스턴스가 될 것인가?

나는 색인 생성과 물건들을 처리하기 위해 카탈로그를 재구성한다는 것을 알고 있지만, 그다지 필요하지 않다. 단지 프로젝트를 반복하지 않고도 양식에 접근 할 수 있어야한다.

감사합니다.

답변

3

예, 저장할 대상 객체에 하위 클래스 persistent.Persistent이 상속 된 클래스가있는 경우 동일한 객체에 대한 참조는 정확히 동일한 (영구적 인) 객체를 가리 킵니다. 당신은 당신이 이것을 설명한대로 중복을 기대해서는 안됩니다.

short-long-version : ZODB는 소스/참조 객체를 직렬화 할 때 특수한 산세 기법을 사용하여 참조를 영구 객체로 간주하고 해당 객체를 다시 저장하는 대신 클래스의 튜플을 저장합니다 점으로 찍힌 이름과 대상 객체의 내부 OID

경고 : 동일한 개체 데이터베이스에서만 작동합니다. 응용 프로그램에서 데이터베이스 간 참조가 없어야합니다.