PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

kloning data hierarkis

Menarik hasil ini secara rekursif itu rumit (walaupun mungkin). Namun, biasanya tidak terlalu efisien dan ada banyak cara yang lebih baik untuk menyelesaikan masalah ini.

Pada dasarnya, Anda menambah tabel dengan kolom tambahan yang menelusuri pohon ke atas - saya akan menyebutnya "Upchain". Ini hanya string panjang yang terlihat seperti ini:

name | id | parent_id | upchain
root1 | 1 | NULL | 1:
root2 | 2 | NULL | 2:
root1sub1 | 3 | 1 | 1:3:
root1sub2 | 4 | 1 | 1:4:
root2sub1 | 5 | 2 | 2:5:
root2sub2 | 6 | 2 | 2:6:
root1sub1sub1 | 7 | 3 | 1:3:7:

Sangat mudah untuk terus memperbarui bidang ini dengan menggunakan pemicu di atas meja. (Permintaan maaf untuk terminologi tetapi saya selalu melakukan ini dengan SQL Server). Setiap kali Anda menambah atau menghapus catatan, atau memperbarui bidang parent_id, Anda hanya perlu memperbarui bidang upchain pada bagian pohon itu. Itu pekerjaan sepele karena Anda hanya mengambil upchain dari catatan induk dan menambahkan id dari catatan saat ini. Semua record anak mudah diidentifikasi menggunakan LIKE untuk memeriksa record dengan string awal di upchainnya.

Apa yang Anda lakukan secara efektif adalah menukar sedikit aktivitas menulis ekstra dengan besar menyimpan ketika Anda datang untuk membaca data.

Ketika Anda ingin memilih cabang lengkap di pohon itu sepele. Misalkan Anda ingin cabang di bawah node 1. Node 1 memiliki upchain '1:' sehingga Anda tahu bahwa setiap node di cabang pohon di bawah node harus memiliki upchain mulai '1:...'. Jadi Anda hanya melakukan ini:

SELECT *
FROM table
WHERE upchain LIKE '1:%'

Ini sangat cepat (tentu saja indeks bidang upchain). Sebagai bonus, ini juga membuat banyak aktivitas menjadi sangat sederhana, seperti menemukan sebagian pohon, level di dalam pohon, dll.

Saya telah menggunakan ini dalam aplikasi yang melacak hierarki pelaporan karyawan yang besar tetapi Anda dapat menggunakannya untuk hampir semua struktur pohon (penguraian bagian, dll.)

Catatan (bagi siapa saja yang tertarik):

  • Saya belum memberikan kode SQL langkah demi langkah, tetapi begitu Anda mendapatkan prinsipnya, penerapannya cukup mudah. Saya bukan programmer yang hebat, jadi saya berbicara berdasarkan pengalaman.
  • Jika Anda sudah memiliki data dalam tabel, Anda perlu melakukan pembaruan satu kali untuk menyinkronkan upchains pada awalnya. Sekali lagi, ini tidak sulit karena kodenya sangat mirip dengan kode UPDATE di pemicu.
  • Teknik ini juga merupakan cara yang baik untuk mengidentifikasi referensi melingkar yang sulit dikenali.


  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 Mengelola Database PostgreSQL Anda Dari ClusterControl CLI

  2. Parameter pernyataan yang disiapkan JDBC di dalam json

  3. Catatan tentang Indeks B-Tree PostgreSQL

  4. Django - (Kesalahan Operasional) FATAL:Otentikasi identitas gagal untuk nama pengguna pengguna

  5. Tabel kueri dengan array_agg/median dari SEMUA posisi sebelumnya, LAST_10, LAST_50, tidak termasuk posisi saat ini