PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Postgres Materialized Path - Lợi ích của việc sử dụng ltree là gì?

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sao chép một bản ghi, sau đó sử dụng id gia tăng tự động của nó cho các hoạt động tiếp theo

  2. Tôi có nên bao gồm các CHỌN trong một giao dịch không?

  3. Tạo thực thể cho một bảng

  4. Điền mảng đa chiều

  5. Truyền tham số sang DB .execute cho danh sách WHERE IN ... INT