1

我正在开发一个用于填写一些巨大表格的应用程序。一个表单可以属于多个项目。此外,表格有两个部分,可以多次填写,例如目标和活动,因此表格可以定义许多目标和活动。

我有一个代表项目的类,另一个代表表单和两个简单​​的类来代表目标和活动。Project 有一个表单列表,Form 有一个活动和目标列表。

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()

我知道在存储项目时,表单列表也会被持久化,并且表单中相应的目标和活动列表也会被保留。

但是在其他 OOBTree、“形式”、“活动”和“目标”的情况下会发生什么?我这样做是为了更容易遍历或查找单个表单/目标/活动。但我不确定 ZODB 是否会缓存这些对象,并且在保存项目时只将它们持久化一次,并保留对该对象的引用。因此,当其中任何一个被修改时,所有引用都会更新。这意味着在执行db['forms']['formID'] = form 时,OOBTree 将指向与项目 OOBTree 相同的对象,因此不会将同一对象保留两次。这是它的工作方式吗?还是会得到重复的持久对象并且都是独立的实例?

我知道有 repoze 目录来处理索引和东西,但我不需要那么多,只需能够访问表单而无需遍历项目。

谢谢!

4

1 回答 1

3

是的,只要您存储的目标对象persistent.Persistent在其继承中具有子类的类,对同一对象的任何引用都将指向完全相同的(持久)对象。正如您所描述的那样,您不应该期望重复。

短-长-版本:ZODB 使用特殊的酸洗技术,当序列化源/引用对象时,它看到引用是对一个持久对象,而不是再次存储该对象,它存储类点名的元组和目标对象的内部 OID。

警告:这只适用于同一个对象数据库。您的应用程序中不应有跨数据库引用。

于 2013-10-21T04:39:53.340 回答