Либо один, в зависимости от того, как часто ваши данные изменяются и насколько они велики. Это все о том, как ZODB хранит эту информацию.
Хранение данных непосредственно на объекте с использованием setattr означает, что данные хранятся в постоянной записи для этого объекта. Если это большой объект, это означает, что для этой записи будет иметь место большая транзакция.
Хранение данных в аннотации zope.annotations означает, что вы получаете отдельную постоянную запись для каждой записи аннотации, поэтому любые изменения в ваших данных приведут к уменьшению транзакции. Но если вы хотите часто обращаться к этим данным, необходимо будет загрузить эту дополнительную постоянную запись поверх всех остальных постоянных записей. Это займет место в вашем кеше ZODB, ваш сервер ZEO или сервер RelStorage должен будет обслуживать его и т. Д.
plone.uuid
использует setattr, потому что он обычно генерируется только один раз для данного объекта, обычно в то время, когда он уже создается. Это также часть данных, доступ к которой часто и довольно мал. Поэтому, поместив его непосредственно на сам объект, он будет загружен, как только вы загрузите этот объект, никаких дополнительных отключений к ZODB не требуется, и он будет изменен только один раз за время существования.
Примечание: приведенное выше предполагает, что аннотации хранятся с помощью адаптера AttributeAnnotations, который является наиболее распространенным методом и используется по умолчанию для содержимого Plone.