Jadi yang Anda inginkan adalah mewujudkan penutupan transitif. Artinya, mengingat tabel aplikasi ini ...
ID | PARENT_ID
------+----------
1 |
2 | 1
3 | 2
4 | 2
5 | 4
... tabel grafik akan terlihat seperti ini:
PARENT_ID | CHILD_ID
-----------+----------
1 | 2
1 | 3
1 | 4
1 | 5
2 | 3
2 | 4
2 | 5
4 | 5
Dimungkinkan untuk mempertahankan tabel seperti ini di Oracle, meskipun Anda perlu menggulung kerangka kerja Anda sendiri untuk itu. Pertanyaannya adalah apakah itu sepadan dengan biaya overhead. Jika tabel sumber tidak stabil, maka menjaga agar data grafik tetap segar mungkin memerlukan lebih banyak siklus daripada yang Anda hemat untuk kueri. Hanya Anda yang tahu profil data Anda.
Saya tidak berpikir Anda dapat mempertahankan tabel grafik seperti itu dengan kueri CONNECT BY dan kunci asing berjenjang. Terlalu banyak aktivitas tidak langsung, terlalu sulit untuk diperbaiki. Tampilan terwujud juga tidak ada, karena kami tidak dapat menulis kueri SQL yang akan mengubah 1->5
record ketika kami menghapus catatan sumber untuk ID=4
.
Jadi apa yang saya sarankan Anda membaca makalah yang disebut Mempertahankan Penutupan Transitif Grafik di SQL oleh Dong, Libkin, Su dan Wong. Ini berisi banyak teori dan beberapa SQL degil (Oracle) tetapi ini akan memberi Anda landasan untuk membangun PL/SQL yang Anda butuhkan untuk memelihara tabel grafik.
"Dapatkah Anda memperluas bagian tentangnya yang terlalu sulit untuk dipelihara dengan CONNECT BY/cascading FKs? Jika saya mengontrol akses ke tabel dan semua penyisipan/pembaruan/penghapusan dilakukan melalui prosedur tersimpan, skenario macam apa yang ada di mana ini akan rusak?"
Perhatikan catatan 1->5
yang merupakan korsleting 1->2->4->5
. Sekarang apa yang terjadi jika, seperti yang saya katakan sebelumnya, kami menghapus catatan sumber untuk ID=4
? Kunci asing bertingkat dapat menghapus entri untuk 2->4
dan 4->5
. Tapi itu menyisakan 1->5
(dan memang 2->5
) dalam tabel grafik meskipun mereka tidak lagi mewakili sisi yang valid dalam grafik .
Apa yang mungkin berhasil (saya pikir, saya belum melakukannya) adalah menggunakan kunci sintetis tambahan di tabel sumber, seperti ini.
ID | PARENT_ID | NEW_KEY
------+-----------+---------
1 | | AAA
2 | 1 | BBB
3 | 2 | CCC
4 | 2 | DDD
5 | 4 | EEE
Sekarang tabel grafik akan terlihat seperti ini:
PARENT_ID | CHILD_ID | NEW_KEY
-----------+----------+---------
1 | 2 | BBB
1 | 3 | CCC
1 | 4 | DDD
1 | 5 | DDD
2 | 3 | CCC
2 | 4 | DDD
2 | 5 | DDD
4 | 5 | DDD
Jadi tabel grafik memiliki kunci asing yang mereferensikan hubungan di tabel sumber yang menghasilkannya, daripada menautkan ke ID. Kemudian hapus record untuk ID=4
akan menghapus semua record dalam tabel grafik di mana NEW_KEY=DDD
.
Ini akan berfungsi jika ID yang diberikan hanya dapat memiliki nol atau satu ID induk. Tapi itu tidak akan berhasil jika hal ini diperbolehkan:
ID | PARENT_ID
------+----------
5 | 2
5 | 4
Dengan kata lain tepi 1->5
mewakili keduanya 1->2->4->5
dan 1->2->5
. Jadi, apa yang mungkin berhasil tergantung pada kompleksitas data Anda.