2010-08-16 4 views
3

테이블이 (id, parent_id, data)인데, 여기에서 parent_id은 동일한 테이블의 다른 행을 가리 킵니다 (또는 null입니다).DB에서 트리의 모든 조상/자손을 가져 오는 쿼리?

특정 ID와 특정 ID (2) 모든 후손 (1) 모든 조상을 조회하는 표준 방법이 있나요?

나는 또한 DBIx::Class에서이 작업을 수행하고 있으므로 해당 모듈 (또는 다른 일부)을 사용하는 가장 편리한 방법이 있다면 그에 대해서도 듣고 싶습니다.

편집 : 명확히 - 모든 부모 = 모든 조상, 모든 어린이 = 모든 자손.

+0

부모/자녀 또는 모든 조상/자손? 또한, 어떤 SQL의 맛을 사용하고 있습니까? –

+0

다소 불가지론적인 SQL을 찾고 있습니다. 우리의 개발 db는 SQLite이지만, 아마도 MySQL이 될 것입니다. – Carl

+0

또한보십시오 http://en.wikipedia.org/wiki/Nested_set_model – reinierpost

답변

1

같습니다 지금 DBIx::Class::Tree::AdjacencyList와 함께 가야합니다. 그것은 거의 (조상 결과 집합, 불행히도 -하지만 우리는 다른 방향에서 물어 봐야 할 질문에 접근하여 해결할 수 있습니다) 모든 것을 않습니다. Grrrr의 대답은 나를 생각하고, 우리가 parent_id 열이 우리의 모델에 부착하고 기본적으로 ID가에있는 search_rs을 수행하여 (AN ancestors 결과 집합을 제공 할 별도의 테이블 + 모듈 (id, record_type, record_ancestors)을 추가 할 수있어 @ 그러나

, 우리가 선택하는 w/e 구분 기호로 관련 조상 행의 분리). 그러한 결과 세트를 얻는 것만으로도 상당한 시간이 걸릴 것입니다. 그래서 우리는 아마도 "부모 x의 자식입니까?"라고 물어 보는 것이 비현실적인 질문을 발견했을 때만 거기에 갈 것입니다. 아이 x "?

편집 : 어쩌면 우리는 DBIx::Class::Tree::Mobius 사용합니다 - 그것은 이해할 것 테이블 원료를 보는 것처럼 보이지만.

+1

Row 클래스에'ancestors' 메소드를 추가하는 것은 매우 쉽습니다. Result 클래스에 직접 추가하거나 AdjacencyList를 서브 클래스 화하고 필요한 메소드를 추가하는 새로운 Component를 생성하는 것이 매우 쉽습니다. 또는 # dbix-class로 막을 수 있고 AdjacencyList 자체에 기능을 추가하는 것에 관해 우리와 채팅 할 수 있습니다. 가지고있는 것은 꽤 합리적 인 것처럼 보인다. – hobbs

+0

@hobbs :이 프로젝트의 공동 작업자는 AdjacencyList에 조상 결과 집합을 추가하는 패치를 제안했습니다. 자신이 작성한 주석을 작성하기에는 SO 담당자가 충분하지 않습니다. – Carl

3

이것은 많이 사용하는 SQL의 특성에 따라 다릅니다.

오라클에서는 START WITH id = yourid CONNECT BY PRIOR id = parent_id 구조를 사용할 수 있습니다. PostgreSQL에서는 함수 connectby('tablename', 'id', 'parent_id', 'id', value, 0)을 사용할 수 있습니다. 많은 경우에

, 그것은 개최 열, 모든 노드에 대한 ,이 노드의 루트 요소 에서 전체 경로를 정의하여, 다른 나무를 대표하는 의미가 있습니다.

인터넷도 DBIx::Class 다루는 내가 본 가장 최근, 에서 찾을 수이 기술 의 많은 사례가있다, 여기에서 찾을 수 있습니다 : 우리가 가고있는 것처럼 http://blogs.perl.org/users/ovid/2010/05/threaded-forum-sql.html

+0

제가 정기적으로이 트리로하고있는 일 중 하나는 트리 구조 내의 노드를 재배치하는 것입니다. 그것은 전체 조상 목록을 저장하는 열을 가지고 막연하게 고통스러운 것 같습니다. 업데이트를 너무 많이하지 않는 것이 좋을 것 같습니다. – Carl

+0

eeeeeh ... 계단식 부분을 제외하고. – Carl

관련 문제