중첩 집합 모델에서 나무 구조 만들기

중첩 집합 모델에 대해서는 간단히 설명합니다. 자세한 내용은 가십시오.
벌써 자세하게 알고 있는 사람은, 날아 만든 것 까지 부디.

중첩 집합 모델



트리 구조 (계층 구조)를 데이터베이스에 저장하려고 할 때 자신의 테이블에 대한 관계를 만드는 것이 간단하고 이해하기 쉽습니다. 그러나 SQL에서 나무의 일부를 얻는 것이 번거롭거나 사용하기 쉽지 않습니다.
따라서 중첩 집합 모델이라는 생각으로 나무 구조를 보존하는 경우가 있습니다. 계층 구조를 중첩 집합 구조로 간주하여 저장합니다.

내 테이블에 대한 관계가있는 사용하기 쉽지 않은 테이블의 예


ID
이름
상사 ID


1
사토
NULL

2
스즈키
1

3
다카하시
2

4
다나카
2

5
이토
1

6
와타나베
5



중첩 집합 모델의 사고 방식

만들고 싶은 나무 구조


중첩 구조로 간주


중첩 집합 모델의 테이블 예


ID
이름
Left
Right


1
사토
1
12

2
스즈키
2
7

3
다카하시
3
4

4
다나카
5
6

5
이토
8
11

6
와타나베
9
10


중첩 집합 모델을 사용하면 나무의 일부를 꺼내기 쉽습니다.
예를 들면 스즈키씨의 부하가 누군가 알고 싶다면, Left가 2이상, Right가 7이하의 행을 꺼내면, 얼마나 계층이 깊어지려고 몰래 전원 꺼낼 수 있다. 반대로 Left가 2 미만이고 Right가 7을 넘는 행은 스즈키씨의 상사이며, 그 중 Left가 가장 작은 사람이 스즈키씨의 직속의 상사가 된다.

만든 것



전체 프로그램은 여기 → htps : // 기주 b. 이 m / Sh 싶은 r / T Rebull l에서 r / t Ree / Ma s r / T Rebull l에서 r

프로그램의 역할은 중첩 집합 모델 목록에서 트리 구조를 생성하는 것입니다.
그리고 나무 구조로부터 중첩 집합 모델의 Left와 Right를 갱신하는 것.

2개의 인터페이스가 있다.
  • ITreeItem는 중첩 집합 모델을 나타내기 위해 LeftRight를가집니다.
  • 데이터베이스에 저장하는 모델 클래스에서도 구현하십시오.

  • ITreeNode는 나무 구조를 나타내기 위해 ParentChildren를가집니다.
  • 뷰 모델이라든지 구현하면 좋다고 생각합니다.


  • 만약 데이터베이스의 모델 클래스를 트리의 노드로서도 사용할 수 있는 경우는, 하나의 클래스에 ITreeItemITreeNode 를 양쪽 모두 구현할 수도 있습니다.

    사용법


    // 木構造の構築
    // ITreeItem を実装するクラスのリストと、 ITreeItem から ITreeNode を生成するメソッドを渡す。
    // 渡す ITreeItem のリストは、Left順にソートしてある必要がある。
    // 木構造が構築されて、ルートノードのリストが返ってくる。
    var roots = TreeBuilder.Rebuild(items, item => new Node(item));
    
    // 木構造を表示したり、何らかの操作を加える
    
    // Left、Rightの更新
    // ルートノードのリストと、ITreeNode から ITreeItem を取得するメソッドを渡す。
    // ITreeItem はnodeの中に持っておくと便利。もしくはディクショナリにでもしておく。
    TreeBuilder.Update(roots, node => node.Item);
    

    테스트용 프로젝트가 리포지토리 안에 있으므로, 그쪽도 참조.
    htps : // 기주 b. 이 m / Sh 싶은 r / T Reebui l에서 r

    좋은 웹페이지 즐겨찾기