我何时应该使用PersistentDict,何时应该使用文件夹?它们在更新,内部结构,性能等方面有何区别?
答案 0 :(得分:3)
PersistentMapping
只是python dict
类型的一个实现(通过标准库UserDict
基类),根据ZODB的Persistence语义进行调整;每次更改_p_changed
时,都不必在最近的类上设置Persistent
标记,该标记从mapping
继承。
Folder
是一个更丰富的类型,实现事件,与Zope Web界面(ZMI)集成,通过Web任意属性(具有类型验证的属性),Zope权限管理,子验证-item id,import / export等。子项目文件夹作为属性存储在对象本身上,一些元数据存储在实例的私有字典中。
当您需要任何额外服务(权限委托,ID验证等)时,请使用Folder
,否则请使用PersistentMapping
。性能明智的查找或存储项目不会有太大差别;一个是下面的直接python dict
,另一个是存储项目的实例__dict__
。
如果您正在寻找冲突避免,您应该查看BTrees,OOBTree
类基本上是一个持久映射,其中值存储在持久存储桶中,在大多数情况下避免冲突,并提供冲突其余的决议。
如果您想要Folder
语义与BTree
存储语义,请查看Products.BTreeFolder2和实现Folder
接口的附加组件,但将子对象存储在{ {1}}而不是直接在实例上的属性。
答案 1 :(得分:2)
PersistentDict (现在称为 PersistentMapping )是一个继承自 UserDict.IterableUserDict 和 persistent.Persistent 的
UserDict.IterableUserDict 是一个内置的python类,它模拟一个可迭代的字典, persistent.Persistent 是一个Zope类,它允许自己的一个实例保存在ZODB。
因此PersistentDict(或PersistentMapping)基本上是一个可以作为ZODB中的对象存储的字典。
普通词典不能作为单独的对象存储在ZODB中。它们必须是继承自 persistent.Persistent 。
的某些类的属性PersistentDict将其键和值存储在实际字典中( data 属性)。
不能通过ZMI添加PersistentDict,我认为它主要用于您希望直接在zodb中存储字典的特殊情况。
使用文件夹,我猜您的意思是 zope.container.folder 中的文件夹。 文件夹将它的子项存储在OOBTree对象中,该对象是一个可以容纳大量对象的容器。
如果您想要一个包含其他内容类型实例的容器,那么您应该使用文件夹。
文件夹具有PersistentDict没有的接口,某些适配器或其他组件可能需要这些接口才能工作。例如, ContainerModified 事件仅在修改Folder时触发,而不是PersistentDict。如果你使用PersistentDict作为通用文件夹,可能会有各种各样的问题。
在性能方面,字体通常会更快,直到密钥空间变得非常大。然后比例尺向OOBTree倾斜。