- Katılım
- 17 Eki 2024
- Mesajlar
- 2
- Tepkime puanı
- 0
- Puanları
- 1
PostgreSQL ltree Uzantısıyla Ağaç Yapılarını Akıllı Şekilde Yönetmek
Hangi Durumlarda ltree?
PostgreSQL’in ltree uzantısı, hiyerarşik verileri tek bir TEXT sütununda saklamanıza izin veren bir kütüphanedir. Ağaç, ağacının her düğümü “. ” ile ayrılmış bir yol stringi olarak temsil edilir. Bu sayede <i>SELECT, UPDATE, DELETE</i> gibi temel işlemlerle birlikte;
* Bölge hiyerarşileri (için coğrafi bölgeler)
* Kategoriler (ürün katalogları)
* Dosya sistemleri (örnek: klasör yolu yönetimi)
* İzin hiyerarşileri (RBAC)
gibi uygulama senaryolarını sıra dışı bir biçimde çözebilirsiniz.
Temel Kayıt Formatı
```
INSERT INTO kategori (id, yol) VALUES
(1, 'root'),
(2, 'root.1'),
(3, 'root.2'),
(4, 'root.1.1'),
(5, 'root.1.2'),
(6, 'root.2.1');
```
```
SELECT * FROM kategori WHERE yol <@ 'root.1';
-- root, root.1, root.1.1, root.1.2 döner
```
İşlevsel Örnek: Klasör Erişim Yetkileri
Her dosya, içinde bulunduğu klasör yolunu sakladığını düşünelim. Kullanıcı göreceği dosyaları belirlemek için aşağıdaki satır geçici olsun:
```
SELECT d.*
FROM dosya d
JOIN yetkilendirme y ON d.yol <@ y.yol
WHERE y.kullanici_id = 42;
```
Böylece yetki hiyerarşisi ve dosya yapısı tek bir sorguda çözülmüş olur.
Performans Tüyosu: İndeksleme
Soru: “Rekord sayısı meniden 10 milyon.” İndeks filtrelenebilir:<br/>
```
CREATE INDEX idx_kategori_yol ON kategori USING gin (yol gin_trgm_ops);
```
gin_trgm_ops, trigram tabanlı aramalarda eşsiz bir performans artışı sağlar.
Zorunlu Test: Örnek Sorgu
Aşağıdaki sorgu, belirli bir nokta altındaki tüm düğümleri ve onların seviyelerini listeler:
```
SELECT id, yol,
nlevel(yol) AS seviye
FROM kategori
WHERE yol <@ 'root.1';
```
Seviye numarası, “root” için 0, “root.1” için 1 ve harika bir alt hiyerarşik indeks sağlar.
Sonuç
ltree, veri tabanı tasarımında hiyerarşik yapıları yapıcı, okunabilir ve sorgulanabilir bir biçime dönüştürerek yönetim karmaşıklığını ortadan kaldırır. Şimdi geçiş zamanı: kolonunuzu TEXT’e çevirin ve ltree ile hiyerarşi kaosunu çözün!







