TL;DR Label yang dapat digunakan kembali, pola pencarian yang kompleks, dan pencarian ancestry terhadap beberapa node turunan (atau satu node yang jalurnya belum diambil) tidak dapat diselesaikan menggunakan indeks jalur yang terwujud.
Bagi mereka yang tertarik dengan detail mengerikan...
Pertama, pertanyaan Anda hanya relevan jika Anda tidak menggunakan kembali label apa pun dalam deskripsi simpul Anda. Jika ya, l-tree benar-benar satu-satunya pilihan dari keduanya. Tetapi implementasi jalur yang terwujud biasanya tidak membutuhkan ini, jadi kesampingkan itu.
Satu perbedaan yang jelas adalah fleksibilitas dalam jenis pencarian yang diberikan l-tree kepada Anda. Pertimbangkan contoh-contoh ini (dari ltree
dokumen yang ditautkan dalam pertanyaan Anda):
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
Permintaan pertama jelas dapat dicapai dengan jalur terwujud. Yang terakhir juga dapat dicapai, di mana Anda akan menyesuaikan kueri sebagai pencarian saudara. Kasus tengah, bagaimanapun, tidak dapat dicapai secara langsung dengan pencarian indeks tunggal. Anda harus memecahnya menjadi dua kueri (semua turunan + semua leluhur), atau menggunakan pemindaian tabel.
Dan kemudian ada pertanyaan yang sangat kompleks seperti ini (juga dari dokumen):
Top.*{0,2}.sport*@.!football|tennis.Russ*|Spain
Indeks jalur yang terwujud tidak akan berguna di sini, dan pemindaian tabel lengkap akan diperlukan untuk menangani ini. l-tree adalah satu-satunya pilihan jika Anda ingin melakukan ini sebagai kueri yang dapat di-SARG.
Tetapi untuk operasi hierarki standar, menemukan salah satu dari:
- orang tua
- anak-anak
- keturunan
- simpul akar
- simpul daun
jalur terwujud akan bekerja sama baiknya dengan l-tree. Bertentangan dengan artikel yang ditautkan di atas , mencari semua keturunan dari nenek moyang yang sama sangat bisa dilakukan dengan menggunakan b-tree. Format kueri WHERE path LIKE 'A.%'
apakah SARGable asalkan indeks Anda disiapkan dengan benar (saya harus secara eksplisit menandai indeks jalur saya dengan varchar_pattern_ops
agar ini berfungsi).
Apa yang hilang dari daftar ini adalah menemukan semua leluhur untuk seorang keturunan. Format kueri WHERE 'A.B.C.D' LIKE path || '.%'
sayangnya tidak akan menggunakan index. Salah satu solusi yang diterapkan oleh beberapa pustaka adalah mengurai simpul leluhur dari jalur, dan menanyakannya secara langsung:WHERE id IN ('A', 'B', 'C')
. Namun, ini hanya akan berfungsi jika Anda menargetkan leluhur dari simpul tertentu yang jalurnya telah Anda ambil. l-tree akan menang dalam hal ini.