zope/zodb应用程序的内部引用。
gocept.reference的Python项目详细描述
简介
这个包提供了一个参考实现。
此实现的特定属性是:
- 用于内部引用
- 提供完整性强制
-
部分在relational
外键之后建模
内容
-
简介
-
动机
-
模型比较
-
观察结果
-
参考实施的结论和要求
-
实施说明
-
引用对象
-
简单参考
-
完整性保证参考
参考集合
管理整套设备
管理集合的单个项目
验证引用存在性
参考资料
参考资料集
zope.schema字段
更改
-
0.9.4(2017-05-15)
-
0.9.3(2017-05-14)
-
0.9.2(2015-08-05)
-
0.9.1(2011-02-02)
-
0.9.0(2010-09-18)
-
0.8.0(2010-08-20)
-
0.7.2(2009-06-30)
-
0.7.1(2009-04-28)
-
0.7.0(2009-04-06)
-
0.6.2(2009-03-27)
-
0.6.1(2009-03-27)
-
0.6(2009-03-26)
-
0.5.2(2008-10-16)
-
0.5.1(2008-10-10)
-
0.5(2008-09-11)
-
0.4(2008-09-08)
-
0.3(2008-04-22)
-
0.2(2007-12-21)
-
0.1(2007-12-20)
动机
在开发应用程序时,我们经常发现需要引用对象
存储为应用程序数据的。这些对象的示例包括
集中管理的"主数据"。
对这些对象的引用通常是我们
开发时,它们的行为应该像普通的python对象引用一样
在我们的应用程序的控制下。
在zope和zodb的世界中,有不同的方法可以实现这一点。这个
不同的方法有不同的语义和副作用。我们的目标是
统一内在参照对象的方式,并提供
根据需要在不同的语义之间切换,而不重写应用程序代码
并且不需要迁移持久数据结构(至少从
应用程序的观点)。
模型比较
我们的目标是确定
现有方法。我们包括三种来自世界各地
python/zope/zodb以及规范化的标准关系方法
表,
我们使用四个标准来描述每个解决方案:
< DL>
参考数据
存储哪些数据来描述引用?
引用语义
引用有什么含义?它的意义如何改变?
完整性
如果涉及
引用更改或被删除?
设置/查找
应用程序开发人员需要做什么来设置引用或
查找引用的对象?
<表>
< COLGROUP >
< COL/>
< COL/>
< COL/>
< COL/>
< COL/>
<广告>
属性
python引用
弱引用
按键参考
关系数据库
< /广告>
<正文>
参考数据
OID
OID
特定于应用程序的键
特定于应用程序(主键+表名)
引用语义
指的是
python对象
指的是
python对象
指的是
与保存的密钥关联
在查找时。
引用关联的对象(行)
在查找时使用主键。
完整性
但是,该引用仍然有效,
目标对象可能已丢失其
应用程序的含义。
引用可能已过时
并将引用对象保留在
无效状态。
引用可能变成
陈旧.
取决于外键的使用
以及约束的数据库实现。
通常可以强制保持有效。
设置/查找
正常的python属性访问。
使用weakref包装存储和
_调用查找。可能使用属性
为方便起见。
取决于实施情况。
可能为了方便而使用属性。
显式存储主键。
使用join查找。
< >
<表>
观察结果
关系:每个对象(行)都有一个确定一级
密钥,
zodb(像文件系统)可以有多个指向对象的硬链接。
当删除到对象的最后一个硬链接时,将删除对象。这个
无法使用硬链接引用对象,因为
对象删除将不会被注意到,对象将继续存在。
zodb本身没有对象所在的规范位置的概念。
已定义。
关系:当引用一个对象时,我们可以通过声明
外键。这与存储的数据正交。
关系:作为应用程序级别的键,用于标识目标
对于引用,应用程序可以选择删除行并重新添加行
以后使用相同的主键。如果强制执行完整性,则需要
在数据库级别支持暂时忽略损坏的外键。
普通的python引用自然地嵌入到应用程序中。
属性允许隐藏查找和存储的实现
参考资料。
参考实施的结论和要求
-
允许配置外键约束
交易)。此配置必须可以随时更改
提供自动迁移路径。
-
使用应用程序级键引用对象。
-
使用规范位置和主键存储对象并确定
是否删除了对象。
-
在修改对象的键时区分两个用例:
-
应用程序引用正确的对象,但具有错误的键(如
密钥本身可能对应用程序有意义)。在这种情况下
必须更新对象才能接收新的、正确的密钥和引用
必须更新以引用此新密钥。
-
应用程序使用正确的键引用了错误的对象。在这
case键引用的对象必须替换为不同的
对象:
实施说明
-
规范位置由位置/包含决定。的主键
引用是被引用对象的位置。
-
通过监视控制事件来实施约束。
-
更新/更改密钥含义的不同方法由
枚举所有键并在
引用对象而不是位置。更改的两个用例
其含义由:
-
将新路径与现有引用ID关联
-
将新引用ID与现有路径关联