Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Membuat tabel/tampilan yang diratakan dari kumpulan data yang ditentukan secara hierarki

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara mencetak beberapa laporan dengan barcode \ atau beberapa barcode dalam satu laporan

  2. Java SQLData - Transmisikan ke objek pengguna dengan daftar/array?

  3. Bagaimana Memanggil Fungsi Oracle dengan Python?

  4. Dimana Patch saya?

  5. Mengapa ddl statis tidak diizinkan di PL/SQL?