2011-11-11 1 views
0

현재 시나리오에서 Nhibernate를 사용하는 데 시간이 많이 걸리는 상황에서 Mongo를 사용하기 위해 작은 프로젝트를 포팅하는 것을보고있었습니다.MongoDb C# 드라이버 지원 순환 참조?

원래 NoRM에 시도해 봤지만 순환 참조에서 지원을 받았고 정상적으로 작동하는 분기가 있었지만 공식 C# 드라이버가 지원하는지 여부를 나타내는 문서를 찾을 수 없습니다.

순환 참조가있는 이유는 도로 목록이 포함 된 위치 개체가 있기 때문에 각 도로마다 다른 위치에 대한 링크가 있기 때문입니다. 패스 파인더에있는 간단한 노드 집합과 매우 비슷합니다.

public class Location 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public IList<Road> Roads { get; set; } 
} 

public class Road 
{ 
    public Location From { get; set; } 
    public Location To { get; set; } 
} 

이제 문제는 전체 세계가 (그들은 실제 시나리오에서 많은 특성을 가지고) 이러한 개체에서 구축이 있고 그들은 모두 그러나 순환 참조를 처리 할 수없이, 인터링크 내가 얼마나 확실하지 않다입니다 각 도로가 출발점과 종점을 알아야하기 때문에이 문제를 해결할 수 있습니다.

위치 개체를 제거하고 위치를 참조하는 ID가 있지만 각 하위 위치를 개별적으로 쿼리해야한다는 단점이 있습니다. 모든 가능한 위치와 가능한 모든 경로가 포함 된 거대한지도가 있으므로 점 사이에 빠른 경로를 찾을 수 있으므로이 작업은 한 번만 수행 된 다음 메모리에 보관됩니다.

답변

1

공식 C#을 드라이버가 정말로에서 "참조"를 지원하지 않습니다 ...

그것은 위치의 경우 일 수 있으며 도로는 문서 저장 방식에 적합하지 않은 다른 방법을 저장할 수 있습니다. 필드의 값은 ObjectID 일 수 있지만 조인 또는 참조의 개념은 공식 C# 드라이버에서 실제로 구현되지 않습니다.

물론 "참조"지원을 사용하더라도 이러한 드라이버는 여전히 여러 쿼리를 실행합니다.

당신이 설명한 사례 감안할 때

, 나는 제안 ... 그것은 위치의 경우 일 수 있으며 도로는 문서 저장 방식에 적합하지 않은 다른 방법으로 저장 될 수 있습니다 그래프 데이터베이스를보고. Neo4J, Microsoft의 Trinity, 음색이 'GraphDB'등의 인기있는 항목이 많이 있습니다.

+0

정보 주셔서 감사합니다. 서버에서 여러 드라이버를 실행하고 집계 된 결과를 반환하거나 개별 쿼리를 실제로 실행합니까? 나는 그것이 전 (前者)일지도 모른다라고 생각했다. 그러나 그 요구에 대한 어떤 사실의 증거도 가지지 않고있다. 객체의 나머지 부분은 주기적이 아니며 문서 저장 이상에 완벽하게 부합하는 것처럼 보입니다. 그러나 초기지도의이 사례가 거래 차단기가 될 수도 있고 언급 한대로이 비트를 관계형으로 저장할 수도 있습니다. 다른 비트 문서 기반 – Grofit

+0

서버 쪽 "조인"명령이 없으므로 클라이언트 쪽이어야합니다. 그래프 데이터베이스를 살펴보십시오. 다른 기본 스토리지를 지원한다는 것을 알고 있으므로 필요한 모든 것을 얻을 수 있습니다. –