【问题标题】:Bi-directional mapping in ZODB in PythonPython中ZODB中的双向映射
【发布时间】:2013-09-23 09:07:43
【问题描述】:

我知道在 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 的映射。当然,在任何时候, BTrees 将包含相同的元素,因为映射的添加和删除是同时在两者上执行的。

我对此的担忧是,如果没有数据库约束,这些树可能会解耦。你觉得这样可行吗?

【问题讨论】:

    标签: python bidirectional zodb bidirectional-relation


    【解决方案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(...)
    

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

    【讨论】:

      猜你喜欢
      • 2010-11-14
      • 2010-11-07
      • 1970-01-01
      • 1970-01-01
      • 2016-04-19
      • 2020-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多