Python中ZODB中的双向映射

时间:2013-09-23 09:07:43

标签: python bidirectional zodb bidirectional-relation

我知道在ZODB中你可以使用BTree存储大量数据,并根据一个键进行查找,总排序与树的大小成对数。

问题是,我有一些Persistent对象Foo和其他一些Persistent对象Bar,我想在它们之间存储双向映射,在bidict的意义上。

即。它应该是有效的(对数时间)来执行两次访问:

# foo is a Foo; bar is a Bar; foos is a collection of persisted Foos; bar is a collection of persisted Bars

baz = foos[foo]
quux = bars[bar]

# baz is a Bar that foo is mapped to
# quux is the Foo that bar is mapped to

我现在能想到的唯一方便的方法是简单地将存储需求加倍并维护两个BTrees:一个存储从A到B的映射,另一个存储从B到A的映射。当然,在所有时候,BTree将包含相同的元素,因为映射的添加和删除都是串联执行的。

我对此的担心是,由于缺少数据库约束,树可能会脱离。你认为这是可行的吗?

1 个答案:

答案 0 :(得分:1)

如果将它们包含在检查约束的类中,这是可行的,即

from ZODB.PersistentMapping import PersistentMapping (for example)

class Bidict(Persistent):
    def __init__(self):
        self._forward = PersistentMapping()
        self._reverse = PersistentMapping()

    def add(self, from, to):
        self._forward[from] = to
        self._reverse[to] = from

    def getFrom(...)
    def getTo(...)

如果只有一种方法可以添加数据(不是故意破坏抽象),那么您就可以保证数据保持一致。