Apa yang akan menjadi cara terbaik untuk menerapkan struktur data pohon yang dapat disesuaikan (artinya, struktur pohon dengan jumlah level yang tidak diketahui) dalam database?
Saya pernah melakukan ini sekali sebelum menggunakan tabel dengan kunci asing untuk dirinya sendiri.
Implementasi lain apa yang bisa Anda lihat, dan apakah implementasi ini masuk akal?
sql
database-design
tree
CodeMonkey1313
sumber
sumber
Jawaban:
Anda menyebutkan yang paling umum diimplementasikan, yaitu Daftar Adjacency: https://blogs.msdn.microsoft.com/mvpawardprogram/2012/06/25/hierarchies-convert-adjacency-list-to-nested-sets
Ada model-model lain juga, termasuk jalur terwujud dan set bersarang: http://communities.bmc.com/communities/docs/DOC-9902
Joe Celko telah menulis buku tentang hal ini, yang merupakan referensi yang baik dari perspektif SQL umum (disebutkan dalam tautan artikel set bersarang di atas).
Juga, Itzik Ben-Gann memiliki ikhtisar yang baik dari opsi yang paling umum dalam bukunya "Di dalam Microsoft SQL Server 2005: T-SQL Querying".
Hal utama yang perlu dipertimbangkan ketika memilih model adalah:
1) Frekuensi perubahan struktur - seberapa sering struktur aktual pohon berubah. Beberapa model memberikan karakteristik pembaruan struktur yang lebih baik. Namun, penting untuk memisahkan perubahan struktur dari perubahan data lainnya. Misalnya, Anda mungkin ingin memodelkan bagan organisasi perusahaan. Beberapa orang akan memodelkan ini sebagai daftar adjacency, menggunakan ID karyawan untuk menghubungkan karyawan ke atasan mereka. Ini biasanya merupakan pendekatan yang kurang optimal. Pendekatan yang sering bekerja lebih baik adalah dengan memodelkan struktur organisasi yang terpisah dari karyawan itu sendiri, dan mempertahankan karyawan sebagai atribut struktur. Dengan cara ini, ketika seorang karyawan meninggalkan perusahaan, struktur organisasi itu sendiri tidak perlu diubah, hanya hubungan dengan karyawan yang tersisa.
2) Apakah pohon menulis-berat atau membaca-berat - beberapa struktur bekerja dengan sangat baik ketika membaca struktur, tetapi mengeluarkan biaya tambahan saat menulis ke struktur.
3) Jenis informasi apa yang perlu Anda peroleh dari struktur - beberapa struktur unggul dalam menyediakan jenis informasi tertentu tentang struktur. Contohnya termasuk menemukan simpul dan semua anak-anaknya, menemukan simpul dan semua orang tuanya, menemukan jumlah simpul anak yang memenuhi kondisi tertentu, dll. Anda perlu mengetahui informasi apa yang akan dibutuhkan dari struktur untuk menentukan struktur yang paling sesuai kebutuhanmu.
sumber
Lihatlah Mengelola Data Hirarki di MySQL . Ini membahas dua pendekatan untuk menyimpan dan mengelola data hierarkis (seperti pohon) dalam database relasional.
Pendekatan pertama adalah model daftar adjacency, yang pada dasarnya Anda gambarkan: memiliki kunci asing yang merujuk ke tabel itu sendiri. Meskipun pendekatan ini sederhana, itu bisa sangat tidak efisien untuk pertanyaan tertentu, seperti membangun seluruh pohon.
Pendekatan kedua yang dibahas dalam artikel adalah model himpunan bersarang. Pendekatan ini jauh lebih efisien dan fleksibel. Lihat artikel untuk penjelasan terperinci dan contoh pertanyaan.
sumber
Jika Anda harus menggunakan Relational DataBase untuk mengatur struktur data pohon maka Postgresql memiliki modul ltree keren yang menyediakan tipe data untuk mewakili label data yang disimpan dalam struktur hierarki seperti pohon. Anda bisa mendapatkan ide dari sana. (Untuk informasi lebih lanjut lihat: http://www.postgresql.org/docs/9.0/static/ltree.html )
Secara umum LDAP digunakan untuk mengatur catatan dalam struktur hierarkis.
sumber
Memiliki meja dengan kunci asing untuk dirinya sendiri masuk akal bagi saya.
Anda kemudian dapat menggunakan ekspresi tabel umum dalam SQL atau terhubung dengan pernyataan sebelumnya di Oracle untuk membangun pohon Anda.
sumber
Kumpulan fantastis fungsi siap pakai yang dapat digunakan dengan model daftar adjacency untuk menjadikan hidup lebih sederhana.
http://www.artfulsoftware.com/mysqlbook/sampler/mysqled1ch20.html
sumber
Saya telah menggunakan implementasi berikut pada SQL SERVER 2005. Periksa di sini
sumber
Jika ada yang menggunakan MS SQL Server 2008 dan yang lebih tinggi mendarat pada pertanyaan ini: SQL Server 2008 dan lebih tinggi memiliki fitur "hierarchyId" baru yang dirancang khusus untuk tugas ini.
Info lebih lanjut di https://docs.microsoft.com/en-us/sql/relational-databases/hierarchical-data-sql-server
sumber