2013-09-23 4 views
1

나는 ZODB에서 BTree을 사용하여 많은 양의 데이터를 저장하고 전체 순서가 트리의 크기와 로그 인 키를 기반으로 조회를 할 수 있음을 알고 있습니다. 문제는Python에서 ZODB의 양방향 매핑

, 좀 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는 맵핑의 추가와 삭제가 둘 다 일괄 적으로 수행되기 때문에 동일한 요소를 포함합니다.

저의 관심은 나무가 데이터베이스 제약 조건없이 분리 될 수 있다는 것입니다. 이것이 가능하다고 생각하십니까?

답변

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

, 당신은 reasonnable 보험이 그 귀하의 데이터는 일관되게 유지됩니다.

+0

이 작업은이 작업을 수행하는 유일한 방법 중 하나처럼 보입니다. – fatuhoku