인접 목록 모델
일상적인 비즈니스 개발에서 우리는 종종 계층 구조를 가진 트리 같은 데이터를 접하게 됩니다. 관계형 데이터베이스에 저장될 때 이 데이터 구조는 종종 다음과 같이 인접 목록이라는 모델에 저장됩니다.
1 2 3 4 5 6 | CREATE TABLE `categories` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` char(100) NOT NULL,
`pid` int(11) DEFAULT 0,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
|
로그인 후 복사
이 모델이 나타내는 그림은 다음과 같습니다. 데이터 모델에 익숙하므로 여기서는 너무 자세히 설명하지 않겠습니다. 다음 데이터 모델
nested set model
에 집중해 보겠습니다. 트리를 표현하는 또 다른 방법은 트리를 세트로 저장하는 것입니다. 다음 테이블 구조를 재정의합니다.
1 2 3 4 5 6 7 | CREATE TABLE `categories` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` char(100) NOT NULL,
`lft` int(11) NOT NULL UNIQUE CHECK (lft> 0),
`rgt` int(11) NOT NULL UNIQUE CHECK (rgt> 1),
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
|
로그인 후 복사
이 모델의 다이어그램은 다음과 같습니다.
lft와 rgt는 둘 사이의 차이가 클수록 더 커집니다. 세트 내부에는 더 많은 요소가 있습니다.
하위 집합을 기준으로 부모의 분류를 찾습니다
1 2 3 4 5 6 7 8 9 10 11 | SELECT c2.*
FROM categories as c1, categories as c2
WHERE c1.lft BETWEEN c2.lft and c2.rgt
AND c1.title = '华为';
+----+-------------+-----+-----+
| id | title | lft | rgt |
+----+-------------+-----+-----+
| 1 | Smartphones | 1 | 14 |
| 5 | Harmony OS | 10 | 13 |
| 8 | 华为 | 11 | 12 |
+----+-------------+-----+-----+
|
로그인 후 복사
부모를 기준으로 그 아래의 모든 하위 집합을 찾습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | SELECT c1.*
FROM categories AS c1, categories AS c2
WHERE c1.lft BETWEEN c2.lft AND c2.rgt
AND c2.title = 'Smartphones';
+----+-------------+-----+-----+
| id | title | lft | rgt |
+----+-------------+-----+-----+
| 1 | Smartphones | 1 | 14 |
| 3 | Android | 2 | 5 |
| 4 | iOS | 6 | 9 |
| 5 | Harmony OS | 10 | 13 |
| 6 | 小米 | 3 | 4 |
| 7 | iPhone | 7 | 8 |
| 8 | 华为 | 11 | 12 |
+----+-------------+-----+-----+
|
로그인 후 복사
각 분류의 수준 보기
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | SELECT COUNT (c2.id) AS indentation, c1.title
FROM categories AS c1, categories AS c2下周三we'fv
WHERE c1.lft BETWEEN c2.lft AND c2.rgt
GROUP BY c1.title
ORDER BY c1.lft;
+-------------+-------------+
| indentation | title |
+-------------+-------------+
| 1 | Smartphones |
| 2 | Android |
| 3 | 小米 |
| 2 | iOS |
| 3 | iPhone |
| 2 | Harmony OS |
| 3 | 华为 |
+-------------+-------------+
|
로그인 후 복사
인접 목록 모델
Adjacency 목록 모델 이해하기 쉽고 필요한 코드도 간단합니다.
그러나 대부분의 프로그래밍 언어에서는 느리고 비효율적입니다. 이는 대부분 재귀로 인해 발생합니다. 트리의 각 노드에 대해 데이터베이스 쿼리를 수행해야 합니다.
각 쿼리에 시간이 걸리기 때문에 큰 트리를 처리할 때 기능이 매우 느려질 수 있습니다. 각 함수마다 숫자를 얻으려면 재귀 알고리즘이 필요하기 때문입니다.
물론 List처럼 재귀에 친화적인 언어를 사용한다면 이 데이터 모델의 단점을 무시할 수 있습니다. 그러나 PHP의 경우 이 데이터 모델의 전체 처리 속도가 매우 느려집니다.
중첩 집합 모델
인접 목록 모델에 비해 이 데이터 모델은 분명히 이해하기 쉽지 않습니다. 그리고 데이터 추가가 그렇게 간단할 수가 없습니다. 추가할 때 왼쪽과 오른쪽의 값을 계산하고, 후속 값을 이동해야 하므로 데이터 추가에 대한 부담이 커집니다.
마찬가지로, 간단한 쿼리로 트리 쿼리를 완성할 수 있고, 두 매개변수 lft와 rgt를 기반으로 하위 요소 수를 계산할 수 있다는 이점이 있습니다.
요약
두 모델 모두 장단점이 있는데, 하나는 삽입보다 좋고 다른 하나는 쿼리보다 좋습니다. 나는 중첩 세트 모델을 선호하지만 여전히 특정 비즈니스에 따라 선택해야 합니다.
위 내용은 트리 데이터 구조 저장 방법(쿼리)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!