İyi Genel Bakış
Genel olarak konuşursak, hızlı okuma süreleri (örneğin, iç içe küme) veya hızlı yazma süreleri (bitişiklik listesi) arasında karar verirsiniz. Genellikle, aşağıdaki seçeneklerin ihtiyaçlarınıza en uygun kombinasyonu ile sonuçlanırsınız. Aşağıda bazı derinlemesine okumalar verilmektedir:
- Bir iç içe aralık ile bitişiklik listesi karşılaştırması : Bulduğum bitişiklik listesi, maddileştirilmiş yol, iç içe geçmiş küme ve iç içe geçmiş aralığının en iyi karşılaştırması .
- Hiyerarşik veriler için modeller : ödünleşmeler ve örnek kullanım hakkında iyi açıklamalara sahip slaytlar
- MySQL'de hiyerarşileri temsil etmek : özellikle İç İçe Kümeye çok iyi genel bakış
- RDBMS'lerde hiyerarşik veriler: gördüğüm en kapsamlı ve iyi organize edilmiş bağlantılar kümesi, ancak açıklamada çok fazla değil
Seçenekler
Biliyorum olanlar ve genel özellikleri:
- Bitişiklik Listesi :
- Sütunlar: Kimlik, ParentID
- Uygulaması kolaydır.
- Ucuz düğüm hareket eder, ekler ve siler.
- Seviyeyi, soyları ve soyundan gelenleri, yolu bulmak için pahalı
- Onları destekleyen veritabanlarında Ortak Tablo İfadeleri ile N + 1'den kaçının
- İç İçe Set (diğer adıyla Modifiye Preorder Ağacı Geçişi )
- Sütunlar: Sol, Sağ
- Ucuz soy, torunları
- Çok pahalı
O(n/2)
hareketler, uçlar, uçucu kodlama nedeniyle siler
- Köprü Tablosu (aka Kapanış Tablosu / w tetikleyicileri )
- Aşağıdakilerle ayrı birleştirme tablosu kullanır: ata, torun, derinlik (isteğe bağlı)
- Ucuz soylar ve kökenler
- Ekleme
O(log n)
, güncelleme, silme için maliyetleri (alt ağacın boyutu) yazar - Normalleştirilmiş kodlama: birleşimlerde RDBMS istatistikleri ve sorgu planlayıcısı için iyi
- Düğüm başına birden çok satır gerektirir
- Kök Sütun (diğer adıyla Malzeme Yolu , Yol Numaralandırma)
- Sütun: soy (örn. / Ebeveyn / çocuk / torun / vb ...)
- Önek sorgusu üzerinden ucuz torunlar (ör.
LEFT(lineage, #) = '/enumerated/path'
) - Ekleme
O(log n)
, güncelleme, silme için maliyetleri (alt ağacın boyutu) yazar - İlişkisel olmayan: Dizi veri türüne veya serileştirilmiş dize biçimine dayanır
- İç İçe Aralıklar
- Yuvalanmış küme gibi, ancak gerçek / float / ondalık ile kodlamanın geçici olmaması için (ucuz taşıma / ekleme / silme)
- Gerçek / kayan nokta / ondalık gösterim / kesinlik sorunları var
- Matris kodlama varyantı , "serbest" için atama kodlaması (materyalize yol) ekler, ancak lineer cebirin hileliğini arttırır.
- Düz Masa
- Her kayda bir Düzey ve Sıra (ör. Sipariş) sütunu ekleyen değiştirilmiş bir Bitişiklik Listesi.
- Ucuz yineleme / sayfalandırma
- Pahalı taşıma ve silme
- İyi Kullanım: dişli tartışma - forumlar / blog yorumları
- Birden çok köken sütunu
- Sütunlar: her soy seviyesi için bir tane, köke kadar tüm ebeveynleri ifade eder, öğenin seviyesinden aşağı seviyeler NULL olarak ayarlanır
- Atalar, torunları, seviye
- Ucuz ekleme, silme, yaprakların hareketi
- İç düğümlerin pahalı ekleme, silme, taşıma
- Hiyerarşinin ne kadar derin olabileceğinin zor sınırı
Veritabanına Özel Notlar
MySQL
torpil
- Bitişiklik Listeleri arasında geçiş yapmak için CONNECT BY kullanın
PostgreSQL
- Materyalize Yol için ltree veri türü
SQL Server
- Genel Özet
- 2008, Hiyerarşi Kimliği veri türünün Kök Sütun yaklaşımına yardımcı olduğu ve temsil edilebilecek derinliği artırdığı görülmektedir.
Closure Tables
üstündürAdjacency List
,Path Enumeration
veNested Sets
kullanım kolaylığı açısından (ve ayrıca performansı tahmin ediyorum).