MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

MongoDB - struktur anak dan induk

Anda perlu mempertimbangkan jenis kueri yang perlu Anda lakukan dan seberapa sering setiap jenis akan dibutuhkan. Ketika saya mengerjakan sesuatu yang serupa, saya menemukan enam kemungkinan tindakan:

  • Lakukan sesuatu dengan orang tua
  • Lakukan sesuatu dengan anak-anak
  • Lakukan sesuatu dengan leluhur (orang tua dari orang tua, orang tua dari orang tua, dll.)
  • Lakukan sesuatu dengan keturunan (anak dari anak, anak dari anak dari anak, dll)
  • Mengubah hubungan (menambah/memindahkan/menghapus node dalam hierarki)
  • Ubah data utama di simpul saat ini (mis. mengubah nilai di bidang "judul")

Anda akan ingin memperkirakan seberapa penting masing-masing ini untuk aplikasi Anda.

Jika sebagian besar pekerjaan Anda melibatkan bekerja dengan data yang tersimpan untuk beberapa artikel tertentu termasuk orang tua langsung dan anak-anaknya, ide pertama paling berguna. Memang di MongoDB, sangat umum untuk menempatkan semua informasi yang Anda butuhkan dalam dokumen yang sama daripada merujuknya secara eksternal sehingga Anda hanya perlu mengambil satu hal dan hanya bekerja dengan data itu. Empat tindakan terakhir dalam daftar lebih rumit.

Secara khusus, Anda perlu melintasi pohon untuk mengambil leluhur dan keturunan dalam kasus ini, bergerak melalui dokumen perantara dan mengikuti jalur, meskipun Anda mungkin hanya peduli dengan dokumen terakhir di jalur tersebut. Ini bisa lambat untuk hierarki yang panjang. Mengubah hubungan dapat memerlukan pemindahan banyak informasi di beberapa dokumen karena semua data ada di masing-masing dokumen. Tetapi bahkan mengubah satu bidang seperti "judul" dapat mengganggu, karena Anda harus mempertimbangkan fakta bahwa bidang ini ada di beberapa dokumen yang berbeda, baik sebagai bidang utama atau di bawah bidang induk atau anak-anak.

Pada dasarnya, ide pertama . Anda bekerja paling baik di lebih banyak aplikasi statis di mana Anda tidak akan banyak mengubah data setelah awalnya membuatnya, tetapi di mana Anda perlu membacanya secara teratur.

Dokumentasi MongoDB memiliki lima pendekatan yang disarankan untuk menangani struktur (hierarki) seperti pohon. Semuanya memiliki kelebihan dan kekurangan yang berbeda-beda, meskipun semuanya memudahkan untuk memperbarui data utama dalam sebuah artikel dengan hanya perlu melakukannya dalam satu dokumen.

  • Referensi Orang Tua :setiap node berisi referensi ke induknya.
  • Keuntungan :
    • Pencarian induk cepat (pencarian menurut "_id" =judul dokumen Anda, kembalikan bidang "induk")
    • Pencarian anak cepat (pencarian menurut "induk" =judul dokumen Anda, yang akan mengembalikan semua dokumen anak)
    • Memperbarui hubungan hanyalah masalah mengubah bidang "induk"
    • Mengubah data pokok memerlukan perubahan hanya pada satu dokumen
  • Kekurangan :
    • Pencarian menurut leluhur dan keturunan lambat, membutuhkan penelusuran
  • Referensi Anak :setiap node berisi larik referensi ke anak-anaknya
    • Keuntungan :
      • Pengambilan cepat anak-anak (kembalikan larik anak-anak)
      • Pembaruan hubungan cepat (cukup perbarui larik anak jika diperlukan)
    • Kekurangan :
      • Menemukan induk memerlukan pencarian _id Anda di semua larik anak dari semua dokumen hingga Anda menemukannya (karena induk akan berisi simpul saat ini sebagai anak)
      • Pencarian leluhur &keturunan memerlukan penelusuran pohon
  • Rangkaian Leluhur :setiap node berisi referensi ke array leluhurnya &induknya
    • Keuntungan :
      • Pengambilan cepat leluhur (tidak perlu melintasi untuk menemukan yang spesifik)
      • Mudah untuk mencari orang tua dan anak dengan mengikuti pendekatan "Referensi Orang Tua"
      • Untuk mencari keturunan, cari saja ancestornya, karena semua keturunan harus memiliki ancestor yang sama
    • Kekurangan :
      • Perlu khawatir tentang menjaga larik leluhur serta bidang induk diperbarui setiap kali ada perubahan dalam hubungan, sering kali di beberapa dokumen.
  • Jalur Terwujud :setiap node berisi jalur ke dirinya sendiri - membutuhkan regex
    • Keuntungan :
      • Mudah menemukan anak dan keturunan menggunakan regex
      • Dapat menggunakan jalur untuk mengambil induk dan leluhur
      • Fleksibilitas, seperti menemukan node dengan jalur parsial
    • Kekurangan :
      • Perubahan hubungan sulit dilakukan karena mungkin memerlukan perubahan jalur di beberapa dokumen
  • Set Bersarang :Setiap simpul berisi bidang "kiri" dan "kanan" untuk membantu menemukan subpohon
    • Keuntungan :
      • Mudah untuk mengambil keturunan secara optimal dengan mencari antara "kiri" dan "kanan"
      • Seperti pendekatan "Referensi Orang Tua", mudah untuk menemukan orang tua dan anak
    • Kekurangan :
      • Perlu melintasi struktur untuk menemukan leluhur
      • Perubahan hubungan berkinerja paling buruk di sini daripada opsi lainnya karena setiap dokumen dalam hierarki mungkin perlu diubah untuk memastikan "kiri" dan "kanan" tetap masuk akal setelah ada perubahan dalam hierarki

Lima pendekatan dibahas secara lebih rinci dalam dokumentasi MongoDB .

Ide kedua Your Anda menggabungkan pendekatan "Referensi Orang Tua" dan "Referensi Anak" yang dibahas di atas. Pendekatan ini memudahkan untuk menemukan anak-anak dan orang tua dan memudahkan untuk memperbarui hubungan dan data utama dari sebuah artikel (meskipun Anda perlu memperbarui bidang induk dan anak-anak), tetapi Anda masih perlu melintasinya untuk menemukan nenek moyang dan keturunan.

Jika Anda tertarik untuk menemukan leluhur dan keturunan (dan lebih peduli tentang ini daripada dapat dengan mudah memperbarui hubungan), Anda dapat mempertimbangkan untuk menambahkan array leluhur ke ide kedua Anda untuk membuatnya juga mudah untuk menanyakan leluhur dan keturunan. Tentu saja, memperbarui hubungan menjadi sangat menyebalkan jika Anda melakukan ini.

Kesimpulan:

  • Pada akhirnya itu semua tergantung pada tindakan apa yang paling dibutuhkan. Karena Anda bekerja dengan artikel, yang data dasarnya (seperti judul) dapat sering berubah, Anda mungkin ingin menghindari ide pertama karena Anda perlu memperbarui tidak hanya dokumen utama untuk artikel itu tetapi semua dokumen anak serta induk.

  • Ide kedua Anda memudahkan untuk mengambil orang tua langsung dan anak-anak. Memperbarui hubungan juga tidak terlalu sulit (Ini tentu lebih baik daripada beberapa opsi lain yang tersedia).

  • Jika Anda benar-benar ingin mempermudah menemukan leluhur dan keturunan dengan mengorbankan memperbarui hubungan dengan mudah, pilih untuk menyertakan larik referensi leluhur.

  • Secara umum, cobalah untuk meminimalkan jumlah traversal yang diperlukan, karena mereka memerlukan menjalankan semacam iterasi atau rekursi untuk mendapatkan data yang Anda inginkan. Jika Anda menghargai kemampuan untuk memperbarui hubungan, Anda juga harus memilih opsi yang mengubah lebih sedikit node di pohon (Referensi Induk, Referensi Anak, dan ide kedua Anda dapat melakukannya).



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB mengonversi tanggal menjadi string

  2. Bagaimana cara menggunakan penguncian optimis dengan Spring Data MongoDB?

  3. Logis ATAU untuk dua bidang berbeda di $where kueri di mongodb

  4. Bagaimana cara mendapatkan dokumen berdasarkan Filter Tanggal (Minggu, Bulan, dan Tanggal Kustom) di MongoDB?

  5. Bagaimana cara memperbarui sejumlah besar dokumen di MongoDB dengan paling efisien?