2011-12-02 3 views
3

몇 가지 그래프가 있습니다. 각 그래프의 폭과 깊이는 달라질 수 있으며 런타임 중에 변경 및 변경됩니다. 예제 그래프를 참조하십시오.오브젝트 데이터베이스로 복잡한 그래프의 지속성을 실현하는 방법은 무엇입니까?

enter image description here

전체 그래프 (즉, 트리)에 보류를 얻을 수있는 루트 노드가있다. 노드는 여러 개의 자식을 가질 수 있으며 각 자식은 특별한 용도로 사용됩니다. 또한 노드는 특정 정보를 검색하기 위해 모든 직접 하위 노드에 액세스 할 수 있습니다. 반면에 자식 노드는 자신의 부모 노드 또는 다른 형제를 인식하지 못할 수 있습니다. 지금까지 특별한 것은 없습니다.

각 그래프를 저장하고 오브젝트 데이터베이스 (이 경우 DB4O)로 업데이트하는 것은 매우 간단합니다. 데이터 지속성 (데이터베이스 트리거 등 포함)을 달성하기 위해 관계형 데이터베이스를 사용할 수 있었지만 대신 객체 데이터베이스를 사용하여이를 실현하려고했습니다.

내 그래프에는 하나의 독특한 점이 있습니다. 다른 예제 그래프를보십시오.

enter image description here

제대로 일부 노드가 다른 노드에서 정보를 요구하는 계산을 수행합니다. 이러한 다른 노드는 형제, 자녀/손자 또는 일부 다른 종류의 자식 일 수 있습니다. 이 경우 특정 노드는 다른 관련 노드를 알고 있습니다 (따라서 필요한 정보를 직접 얻을 수 있습니다). 단순화를 위해 첫 번째 이미지는 모든 잠재적 연결을 표시하지 않았습니다.

한 노드가 (예 : 내부 타이머에 의해 트리거되거나 다른 노드에 의해 트리거되는) 상태 변경이있는 경우 다른 노드 (관심이있는 사람, observer pattern 참조)에게 변경 사항을 알립니다. 정보를받은 각 노드는 자신의 상태를 업데이트하기 위해 적절한 조치를 취합니다 (필요에 따라 다른 옵서버에게 차례대로 알려줍니다). 루트 노드는 발생하는 모든 변경 사항을 알지 못합니다. 관련 노드 만이 무언가가 변경되었음을 알게되기 때문입니다. 이러한 일련의 이벤트가 루트 노드에 의해 트리거되면 물론 큰 문제는 아닙니다.

목표는 오브젝트 데이터베이스를 사용하여 데이터 지속성을 보장하는 것입니다. 메모리의 데이터는 데이터베이스에 저장된 데이터와 동기화되어야합니다. 복잡성에 추가되는 것은 그래프가 단순하고 어리석은 데이터 노드로 구성되지는 않지만 많은 기능이 각 노드에 통합되어 있다는 것입니다 (즉, 그래프 전체에서 상태 변경을 트리거하는 이벤트).

필자는 제시된 문제 (예 : (1) 데이터 및 기능의 강력한 분리 또는 (2) 데이터베이스 통합 강화 또는 (3) 데이터를 업데이트하기위한 임의의 시간 간격 설정 및 데이터가 일정 시간 동안 동기화되지 않을 수 있음을 인정합니다.) 필자는 이러한 핵심 문제와 관련하여 몇 가지 더 많은 입력과 옵션을 찾고 있습니다 (구체적인 구현에서 중요한 발자취를 남길 것입니다).

(편집 됨) 내가 언급 한 것을 잊어 버리는 또 다른 측면이 있습니다. 그래프는 항상 메모리에 존재해서는 안됩니다. 필요하지 않은 그래프는 데이터베이스에만 표시되어 정지 상태가됩니다. 이것은 고려해야 할 또 다른 문제입니다. 정지 상태에있는 동안 업데이트 메커니즘은 아마 잠자기 상태가되어 의도하지 않습니다.

답변

1

db4o의 경우 "투명 활성화"를 체크하면 그래프를 탐색 할 때 필요에 따라 자동으로 개체를로드 할 수 있습니다 (이 방법으로 그래프가 모두 메모리에있을 필요는 없습니다). "투명 지속성"을 체크 아웃하십시오. 상태 변경 후 각 노드가 자체 유지할 수 있도록합니다.

http://www.gamlor.info/wordpress/2009/12/db4o-transparent-persistence/

또한 당신은 db4o는 작업 중에 사용자 정의 동작을 트리거 할 db4o는 "콜백"를 사용할 수 있습니다.

1

정확한 질문은 무엇입니까

독일어 HTH? 다음은 몇 가지 주석입니다.

@German이 이미 언급 한 바 : 복잡한 객체 그래프의 경우 transparent persistence을 사용하고 싶을 것입니다.

마찬가지로 @German mentione : Callback은 개체가 데이터베이스에서 읽기/쓰기되는 등의 추가 작업을 도와줍니다.

옵저버 패턴. .NET 또는 Java에 있습니까? 일반적으로 관찰자는 비즈니스 논리, GUI 등의 일부이기 때문에 일반적으로 데이터베이스에 관찰자를 저장하지 않으려합니다. .NET 이벤트는 자동으로 저장되지 않습니다. Java에서는 관찰자 참조를 유지하는 필드를 일시적으로 표시해야합니다.

예를 들어 개체 그래프에 다른 요소가 있기 때문에 실제로 관찰자를 저장하려는 경우에 유용합니다. .NET에서는 델리게이트/클로저를 저장할 수 없습니다. 따라서 관찰자를 호출하기위한 인터페이스를 도입해야합니다. Java : 종종 익명의 내부 클래스를 리스너로 사용합니다. db4o는 이러한 클래스를 저장할 수 있지만 추천하지는 않습니다. 익명의 내부 클래스는 변경 될 수있는 생성 된 이름을 가져 오기 때문에 그러면 db4o는 코드를 변경 한 후에 해당 클래스를 찾지 못합니다.

그게 전부입니다. 더 많은 것을 알고 싶다면 더 자세한 질문을하십시오.

관련 문제