1

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

问题是,我有一些PersistentobjectFoo和一些其他Persistentobject ,我想在bidictBar的意义上存储它们之间的双向映射。

即执行两种访问应该是有效的(对数时间):

# 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 都将包含相同的元素,因为映射的添加和删除是同时在两者上执行的。

我对此的担忧是,由于没有数据库约束,这些树可能会解耦。你认为这可行吗?

4

1 回答 1

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(...)

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

于 2013-09-23T09:42:09.293 回答