将标记值存储到Plone中的内容的最佳方法是什么:zope.annotation或setattr

时间:2011-10-05 12:19:52

标签: plone

这是开发人员的常见情况。您希望为需要存储数据的网站的每种内容类型添加功能。它是一种元数据,而不是配置数据。

我看到两个解决方案:

  • zope.annotation
  • setattr:将属性添加到持久对象

我真的不知道为什么,但是从Plone2.5开始使用zope.annotation很好,现在它似乎不是存储额外数据的首选方式。例如,plone.uuid使用setattr存储唯一ID。

1 个答案:

答案 0 :(得分:6)

任何一个,取决于您的数据更改的频率和大小。这都是关于ZODB如何存储这些信息的。

使用setattr直接在对象上存储数据意味着数据存储在该对象的持久记录中。如果那是一个很大的对象,那就意味着那个写作会发生一件大事。

在zope.annotations注释中存储数据意味着您为每个注释条目获取单独的持久性记录,因此对数据的任何更改都将导致较小的事务。但是,如果您想经常访问此数据,则需要在所有其他持久性记录之上加载该额外的持久性记录。它将在您的ZODB缓存中占用一个插槽,您的ZEO服务器或RelStorage服务器将需要为其提供服务等。

plone.uuid使用setattr,因为它通常只为给定对象生成一次,通常是在创建它时。它也是一个经常访问且非常小的数据。因此,通过将其直接放在对象本身上,它将在您加载该对象时立即加载,不需要额外访问ZODB,并且它只会在其生命周期内更改一次。

注意:上面假设注释与AttributeAnnotations适配器一起存储,这是最常用的方法,也是Plone内容的默认方法。