Việc kéo kết quả này trong đệ quy là một việc khó khăn (mặc dù có thể). Tuy nhiên, nó thường không hiệu quả lắm và có nhiều cách tốt hơn để giải quyết vấn đề này.
Về cơ bản, bạn tăng cường bảng với một cột bổ sung theo dõi cây ở trên cùng - tôi sẽ gọi nó là "Upchain". Nó chỉ là một chuỗi dài trông giống như sau:
name | id | parent_id | upchain
root1 | 1 | NULL | 1:
root2 | 2 | NULL | 2:
root1sub1 | 3 | 1 | 1:3:
root1sub2 | 4 | 1 | 1:4:
root2sub1 | 5 | 2 | 2:5:
root2sub2 | 6 | 2 | 2:6:
root1sub1sub1 | 7 | 3 | 1:3:7:
Rất dễ dàng để cập nhật trường này bằng cách sử dụng trình kích hoạt trên bảng. (Xin lỗi vì thuật ngữ nhưng tôi đã luôn làm điều này với SQL Server). Mỗi khi bạn thêm hoặc xóa bản ghi, hoặc cập nhật trường parent_id, bạn chỉ cần cập nhật trường upchain trên phần đó của cây. Đó là một công việc tầm thường bởi vì bạn chỉ lấy chuỗi lên của bản ghi mẹ và nối thêm id của bản ghi hiện tại. Tất cả các bản ghi con được xác định dễ dàng bằng cách sử dụng LIKE để kiểm tra các bản ghi có chuỗi bắt đầu trong chuỗi lên của chúng.
Những gì bạn đang làm hiệu quả là giao dịch thêm một chút hoạt động viết cho một lớn tiết kiệm khi bạn đọc dữ liệu.
Khi bạn muốn chọn một nhánh hoàn chỉnh trên cây, điều đó thật tầm thường. Giả sử bạn muốn nhánh bên dưới nút 1. Nút 1 có chuỗi lên '1:', vì vậy bạn biết rằng bất kỳ nút nào trong nhánh của cây dưới nút đó phải có chuỗi lên bắt đầu là '1:...'. Vì vậy, bạn chỉ cần làm điều này:
SELECT *
FROM table
WHERE upchain LIKE '1:%'
Đây là cực kỳ nhanh (tất nhiên là lập chỉ mục trường upchain). Như một phần thưởng, nó cũng làm cho nhiều hoạt động cực kỳ đơn giản, chẳng hạn như tìm một phần cây, cấp độ trong cây, v.v.
Tôi đã sử dụng điều này trong các ứng dụng theo dõi phân cấp báo cáo nhân viên lớn nhưng bạn có thể sử dụng nó cho khá nhiều cấu trúc cây (phân tích các bộ phận, v.v.)
Ghi chú (cho bất kỳ ai quan tâm):
- Tôi chưa đưa ra từng bước về mã SQL nhưng khi bạn nắm được nguyên tắc, việc triển khai khá đơn giản. Tôi không phải là một lập trình viên giỏi nên tôi đang nói từ kinh nghiệm.
- Nếu bạn đã có dữ liệu trong bảng, bạn cần thực hiện cập nhật một lần để ban đầu các upchains được đồng bộ hóa. Một lần nữa, điều này không khó vì mã này rất giống với mã CẬP NHẬT trong trình kích hoạt.
- Kỹ thuật này cũng là một cách tốt để xác định các tham chiếu vòng tròn mà nếu không thì khó phát hiện ra.