Vì bạn đang thực hiện các hoạt động phân cấp, bạn nên sử dụng chiến lược để lưu và truy xuất dữ liệu này từ cơ sở dữ liệu của mình.
Một cách tiếp cận là sử dụng Mô hình tập hợp lồng nhau , điều đó có thể làm cho nó dễ dàng hơn. , điều đó cũng giải thích cách nó hoạt động và tôi trích dẫn:
Lý thuyết đằng sau, phiên bản TL; DR
Một cách dễ dàng để hình dung cách hoạt động của một tập hợp lồng nhau là nghĩ về một thực thể mẹ bao quanh tất cả các con của nó và cha mẹ của nó bao quanh nó, v.v. Vì vậy, cây này:
root
|_ Child 1
|_ Child 1.1
|_ Child 1.2
|_ Child 2
|_ Child 2.1
|_ Child 2.2
Có thể được hình dung như thế này:
___________________________________________________________________
| 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
| |___________________________| |___________________________| |
|___________________________________________________________________|
Các con số đại diện cho ranh giới bên trái và bên phải. Bảng sau đó có thể trông như thế này:
id | parent_id | lft | rgt | depth | data
1 | | 1 | 14 | 0 | root
2 | 1 | 2 | 7 | 1 | Child 1
3 | 2 | 3 | 4 | 2 | Child 1.1
4 | 2 | 5 | 6 | 2 | Child 1.2
5 | 1 | 8 | 13 | 1 | Child 2
6 | 5 | 9 | 10 | 2 | Child 2.1
7 | 5 | 11 | 12 | 2 | Child 2.2
Để có được tất cả các con của một cha / mẹ nút, bạn
SELECT * WHERE lft IS BETWEEN parent.lft AND parent.rgt
Để có được số lượng trẻ em, đó là
(right - left - 1)/2
Để đưa một nút và tất cả tổ tiên của nó trở về gốc, bạn
SELECT * WHERE node.lft IS BETWEEN lft AND rgt
Như bạn có thể thấy, các truy vấn sẽ là cây nhị phân đệ quy và cực kỳ chậm đột nhiên khá nhanh. Tiện lợi phải không?