better_nested_set - 귀속 대신 구조 설계

다음과 같은 나무가 있습니다.

root
    |_ Child 1
      |_ Child 1.1
      |_ Child 1.2
    |_ Child 2
      |_ Child 2.1
      |_ Child 2.2

다음과 같은 구조로 작성할 수도 있습니다.

    ___________________________________________________________________
   |  Root                                                             |
   |    ____________________________    ____________________________   |
   |   |  Child 1                  |   |  Child 2                  |   |
   |   |   __________   _________  |   |   __________   _________  |   |
   |   |  |  C 1.1  |  |  C 1.2 |  |   |  |  C 2.1  |  |  C 2.2 |  |   |
   1   2  3_________4  5________6  7   8  9_________10 11_______12 13  14
   |   |___________________________|   |___________________________|   |
   |___________________________________________________________________|

숫자는 좌우 경계를 대표하고 데이터베이스에 있는 표의 구조는 다음과 같다.

   id | parent_id | lft  | rgt  | data
    1 |           |    1 |   14 | root
    2 |         1 |    2 |    7 | Child 1
    3 |         2 |    3 |    4 | Child 1.1
    4 |         2 |    5 |    6 | Child 1.2
    5 |         1 |    8 |   13 | Child 2
    6 |         5 |    9 |   10 | Child 2.1
    7 |         5 |   11 |   12 | Child 2.2

부결점parent의 모든 아이를 선택하십시오:

 SELECT * FROM table_name WHERE lft > parent.lft AND lft < parent.rgt

결점 차일드 1의 모든 하위 결점을 선택하는 경우:

 SELECT * FROM table_name WHERE lft > 2 AND lft < 7

결과는 다음과 같습니다.

   id | parent_id | lft  | rgt  | data
    3 |         2 |    3 |    4 | Child 1.1
    4 |         2 |    5 |    6 | Child 1.2

하나의 결점을 가진 아이의 수를 계산하다.

 (right - left - 1)/2

node 결점과 모든 부모 결점을 선택합니다.

 SELECT * FROM table_name WHERE node.lft BETWEEN lft AND rgt

결점 Child 1.2와 모든 상위 결점을 선택한 경우:

 SELECT * FROM tabla_name WHERE 5 BETWEEN lft AND rgt

결과는 다음과 같습니다.

   id | parent_id | lft  | rgt  | data
    1 |           |    1 |   14 | root
    2 |         1 |    2 |    7 | Child 1
    4 |         2 |    5 |    6 | Child 1.2

이렇게 하면 귀속 조회보다 훨씬 빠르다.
주의:left와right는 데이터의 보존자입니다

좋은 웹페이지 즐겨찾기