TL; DR Không thể thực hiện các nhãn có thể tái sử dụng, các mẫu tìm kiếm phức tạp và tìm kiếm tổ tiên đối với nhiều nút con (hoặc một nút duy nhất có đường dẫn chưa được truy xuất) bằng cách sử dụng chỉ mục đường dẫn cụ thể hóa.
Đối với những người quan tâm đến các chi tiết đẫm máu ...
Thứ nhất, câu hỏi của bạn chỉ có liên quan nếu bạn không sử dụng lại bất kỳ nhãn nào trong mô tả nút của mình. Nếu là bạn, cây l thực sự là lựa chọn duy nhất trong số hai. Nhưng các triển khai đường dẫn cụ thể hóa thường không cần điều này, vì vậy hãy tạm gác điều đó sang một bên.
Một sự khác biệt rõ ràng sẽ là tính linh hoạt trong các loại tìm kiếm mà l-tree mang lại cho bạn. Hãy xem xét những ví dụ này (từ ltree
tài liệu được liên kết trong câu hỏi của bạn):
foo Match the exact label path foo
*.foo.* Match any label path containing the label foo
*.foo Match any label path whose last label is foo
Truy vấn đầu tiên rõ ràng là có thể đạt được với đường dẫn cụ thể hóa. Cuối cùng cũng có thể đạt được, nơi bạn sẽ điều chỉnh truy vấn dưới dạng tra cứu anh chị em. Tuy nhiên, trường hợp ở giữa không thể đạt được trực tiếp chỉ với một lần tra cứu chỉ mục. Bạn có thể phải chia điều này thành hai truy vấn (tất cả con cháu + tất cả tổ tiên) hoặc sử dụng bảng quét.
Và sau đó là những truy vấn thực sự phức tạp như truy vấn này (cũng từ tài liệu):
Top.*{0,2}.sport*@.!football|tennis.Russ*|Spain
Chỉ mục đường dẫn cụ thể hóa sẽ vô dụng ở đây và cần phải quét toàn bộ bảng để xử lý điều này. l-tree là tùy chọn duy nhất nếu bạn muốn thực hiện điều này dưới dạng truy vấn SARGable.
Nhưng đối với các hoạt động phân cấp tiêu chuẩn, việc tìm kiếm bất kỳ:
- cha mẹ
- trẻ em
- hậu duệ
- nút gốc
- nút lá
đường dẫn vật chất sẽ hoạt động tốt như l-tree. Trái ngược với bài viết được liên kết ở trên , tìm kiếm tất cả con cháu của một tổ tiên chung là rất khả thi bằng cách sử dụng cây b. Định dạng truy vấn WHERE path LIKE 'A.%'
là SARGable miễn là chỉ mục của bạn được chuẩn bị đúng cách (Tôi đã phải gắn thẻ rõ ràng chỉ mục đường dẫn của mình bằng varchar_pattern_ops
để làm cho điều này hoạt động).
Điều còn thiếu trong danh sách này là tìm thấy tất cả tổ tiên cho một hậu duệ. Định dạng truy vấn WHERE 'A.B.C.D' LIKE path || '.%'
rất tiếc là sẽ không sử dụng chỉ mục. Một cách giải quyết mà một số thư viện triển khai là phân tích cú pháp các nút tổ tiên khỏi đường dẫn và truy vấn chúng trực tiếp:WHERE id IN ('A', 'B', 'C')
. Tuy nhiên, điều này sẽ chỉ hoạt động nếu bạn đang nhắm mục tiêu tổ tiên của một nút cụ thể có đường dẫn bạn đã truy xuất. l-tree sẽ thắng trận này.