http://dirtsimple.org/2010/11/simplest-way-to-do-tree-based-queries.html menyediakan algoritme untuk menyisipkan dan menghapus dari Tabel Penutupan.
Saya ingin memodelkan struktur data yang serupa, kecuali bahwa node mungkin memiliki banyak orang tua.
Diberikan:
Jika kami menghapus [B, C]
saya berharap akan berakhir dengan:
dan jika kita menghapus simpul B
saya berharap berakhir dengan:
Namun, jika Anda menggunakan algoritme penulis untuk menghapus tautan atau simpul, Anda akan melihat bahwa itu menandai [D, C, 1]
untuk dihapus, yang tidak diinginkan.
Apa yang saya coba sejauh ini
Saya telah mencoba mengadaptasi struktur data asli dengan menambahkan references
kolom yang menunjukkan berapa banyak cara untuk melakukan perjalanan antara dua node. Dalam contoh di atas, Anda dapat melakukan perjalanan dari A
ke C
baik melalui B
atau melalui D
. Idenya adalah ketika B
dihapus, jalur dari A
ke C
disimpan dan jumlah referensi berkurang dari 2 menjadi 1. Itu bagus secara teori, tapi saya tidak tahu bagaimana cara agar implementasi berjalan dan sekarang saya bertanya-tanya apakah itu mungkin (struktur data mungkin tidak mengandung cukup informasi untuk mencari tahu baris mana yang harus dihapus).
Apa yang saya tanyakan
Bagaimana Anda mengadaptasi Tabel Penutupan untuk mendukung banyak orang tua? Struktur data alternatif apa yang akan Anda rekomendasikan? https://stackoverflow.com/q/4048151/14731 berisi daftar exaustive dari struktur data seperti itu, tetapi tidak jelas mana yang mendukung (atau yang terbaik untuk) banyak orang tua.
references
kolomnya?Jawaban:
Biasanya membuat tabel node dan tabel hubungan. Grafik yang diarahkan tidak benar-benar hierarkis dan mereka dapat memiliki loop yang membuat kueri lebih sulit. Tetapi jika Anda menganggap DAG sebagai pohon umum (Yaitu pohon yang memungkinkan banyak orang tua tetapi masih sangat hierarkis) dan grafik terarah sebagai DAG umum (yaitu seperti DAG tetapi tidak sepenuhnya hierarkis) segalanya menjadi lebih mudah.
Jadi untuk solusi PostgreSQL yang sangat sederhana, kami mungkin melakukan sesuatu seperti:
Kemudian Anda dapat menanyakan sesuatu seperti ini:
sumber