Struktur Database untuk Struktur Data Pohon

151

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?

CodeMonkey1313
sumber
SQL Server (sejak 2008) menawarkan tipe data hierarki
BornToCode

Jawaban:

80

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.

JeremyDill
sumber
Hai, saya menghadapi masalah yang sama persis seperti yang dinyatakan dalam pertanyaan dan ingin mengajukan pertanyaan kepada Anda tentang topik di atas. Mempertimbangkan struktur seperti pada topik nomor satu (tabel struktur organisasi (bukan struktur karyawan) dengan ParentId yang dirujuk dalam tabel yang sama), saya perlu menetapkan siapa yang menjadi bos di area tertentu. Saya akan menugaskan semua karyawan di area spesifik itu langsung ke sana. Di mana Anda menempatkan bos dari area spesifik itu? Di dalam area yang sama atau satu gorup di atas? Pendekatan saya adalah untuk merujuknya ke grup di atas, yang memberi saya struktur yang lebih baik. Terima kasih.
Marcos Buarque
1
Tautan pertama tampaknya rusak.
Jorge Leitao
Jawaban yang sangat bagus. Terima kasih @JeremyDWill!
bobocopy
56

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.

Ayman Hourieh
sumber
tautan Anda memiliki topik yang sangat menarik untuk dibahas. Terima kasih!
Fritz
9

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.

yurilo
sumber
2

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.

Aaron Daniels
sumber
Saya memiliki tabel log, dengan kolom identitas LogID, dan kolom ParentLogID dengan FK yang menunjuk kembali ke kolom LogID. Ketika baris log pertama dalam transaksi ditulis, saya ambil SCOPE_IDENTITY (). Semua catatan log lainnya ditulis dengan nilai ini di kolom ParentLogID. Ini sangat berguna untuk pengelompokan baris yang dimiliki bersama. Ini adalah satu-satunya cara nyata untuk melihat apa yang terjadi, tanpa ini, ini akan menjadi kekacauan besar baris log dari beberapa transaksi yang semuanya tercampur menjadi satu.
KM.
@ KM - Dia berkata "tidak masuk akal" tidak "tidak masuk akal"
John Rasch
1

Saya telah menggunakan implementasi berikut pada SQL SERVER 2005. Periksa di sini

emzero
sumber