我知道在 ZODB 中,您可以使用BTree来存储大量数据,并根据总排序与树大小成对数的键进行查找。
问题是,我有一些Persistent
objectFoo
和一些其他Persistent
object ,我想在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 都将包含相同的元素,因为映射的添加和删除是同时在两者上执行的。
我对此的担忧是,由于没有数据库约束,这些树可能会解耦。你认为这可行吗?