Tinjauan Umum yang Baik
Secara umum, Anda membuat keputusan antara waktu baca cepat (misalnya, kumpulan bersarang) atau waktu menulis cepat (daftar adjacency). Biasanya, Anda berakhir dengan kombinasi opsi di bawah ini yang paling sesuai dengan kebutuhan Anda. Berikut ini adalah beberapa bacaan mendalam:
- Satu lagi Nested Interval vs perbandingan Adjacency List : perbandingan terbaik dari Adjacency List, Materialized Path, Nested Set dan Nested Interval yang saya temukan.
- Model untuk data hierarkis : slide dengan penjelasan tradeoff yang baik dan contoh penggunaan
- Merupakan hierarki dalam MySQL : ikhtisar yang sangat baik dari Nested Set pada khususnya
- Data hierarkis dalam RDBMS : serangkaian tautan paling komprehensif dan terorganisasi dengan baik yang pernah saya lihat, tetapi tidak banyak dalam penjelasan
Pilihan
Yang saya tahu dan fitur umum:
- Daftar Adjacency :
- Kolom: ID, ParentID
- Mudah diimplementasikan.
- Simpul node murah bergerak, menyisipkan, dan menghapus.
- Mahal untuk menemukan level, keturunan & keturunan, jalan
- Hindari N + 1 melalui Common Table Expressions di database yang mendukungnya
- Nested Set (alias Modifikasi Preorder Tree Traversal )
- Kolom: Kiri, Kanan
- Nenek moyang yang murah, keturunan
O(n/2)
Bergerak sangat mahal , menyisipkan, menghapus karena pengodean yang mudah menguap
- Bridge Table (alias Closure Table / pemicu w )
- Menggunakan tabel gabungan terpisah dengan: leluhur, keturunan, kedalaman (opsional)
- Nenek moyang dan keturunan yang murah
- Menulis biaya
O(log n)
(ukuran subtree) untuk memasukkan, memperbarui, menghapus - Pengkodean yang dinormalisasi: baik untuk statistik RDBMS & perencana permintaan dalam gabungan
- Membutuhkan banyak baris per node
- Kolom Lineage (alias Path Terwujud , Enumerasi Path)
- Kolom: garis silsilah (misalnya / orang tua / anak / cucu / dll ...)
- Keturunan murah melalui kueri awalan (mis.
LEFT(lineage, #) = '/enumerated/path'
) - Menulis biaya
O(log n)
(ukuran subtree) untuk memasukkan, memperbarui, menghapus - Non-relasional: bergantung pada tipe data array atau format string serial
- Interval bersarang
- Seperti set bersarang, tetapi dengan real / float / desimal sehingga pengkodean tidak mudah berubah (langkah murah / masukkan / hapus)
- Memiliki masalah representasi / presisi desimal / float / desimal
- Varian pengkodean matriks menambahkan pengkodean leluhur (jalur terwujud) untuk "gratis", tetapi dengan menambahkan trickiness aljabar linier.
- Meja datar
- Daftar Adjacency yang dimodifikasi yang menambahkan kolom Level dan Peringkat (mis. Pemesanan) ke setiap catatan.
- Murah untuk beralih / berhenti
- Pindahkan dan hapus mahal
- Penggunaan Baik: diskusi beralur - komentar forum / blog
- Beberapa kolom garis keturunan
- Kolom: satu untuk setiap level garis keturunan, merujuk ke semua orang tua hingga ke akar, level turun dari level item diatur ke NULL
- Nenek moyang murah, keturunan, level
- Sisipkan murah, hapus, pindahkan daun
- Sisipkan mahal, hapus, pindahkan node internal
- Batas keras seberapa dalam hierarki dapat
Catatan Khusus Basis Data
MySQL
Peramal
- Gunakan CONNECT BY untuk melintasi Daftar Adjacency
PostgreSQL
- Tiga tipe data untuk Path Terwujud
SQL Server
- Ringkasan umum
- 2008 menawarkan tipe data HierarchyId muncul untuk membantu dengan pendekatan Lineage Column dan memperluas kedalaman yang dapat direpresentasikan.
Closure Tables
lebih unggul daripadaAdjacency List
,Path Enumeration
danNested Sets
dalam hal kemudahan penggunaan (dan saya menebak kinerja juga).