Kapan kita harus menggunakan MongoDB?

17

MongoDB adalah database NoSQL yang saya temukan cukup mudah digunakan. Baru-baru ini saya harus mengembangkan aplikasi sederhana yang diperlukan untuk mengumpulkan beberapa data menggunakan permintaan HTTP dan menyimpan beberapa hasil setelah memproses data, dan saya mencoba menggunakan MongoDB.

Dari pengalaman ini saya menemukan itu jauh lebih baik untuk digunakan daripada database relasional tradisional dan karena saya seorang pengembang, dan bukan DBA, pekerjaan saya sangat disederhanakan.

Namun, kadang-kadang saya merasa tidak yakin kapan saya harus menggunakan MongoDB daripada database relasional tradisional, seperti SQL Server atau MySQL.

Dalam hal itu, kapan kita bisa menggunakan MongoDB alih-alih basis data relasional? Apakah ada beberapa peringatan besar tentang MongoDB yang membuatnya tidak layak untuk beberapa situasi?

pengguna1620696
sumber
8
Gunakan MongoDB kapan pun Anda tidak peduli dengan detail kecil yang tidak penting seperti integritas referensial (untuk menjamin data tidak menjadi rusak,) skema (untuk memastikan data benar-benar berisi apa yang menurut Anda berisi), konsistensi (jaminan bahwa data Anda memasukkan benar-benar akan disimpan ,) atau kemampuan untuk menulis pertanyaan non-sepele terhadap dataset Anda (sehingga Anda benar-benar dapat melakukan hal-hal yang berguna dan kreatif dengan data.)
Mason Wheeler
2
@MasonWheeler Setuju. Dalam konteks ini, "sederhana dan menyenangkan untuk digunakan" berarti "lebih mudah digunakan ketika menulis bug dan merusak data";)
Andres F.

Jawaban:

17

Pada dasarnya:

  • Jika Anda bisa merepresentasikan data Anda dalam bentuk kumpulan dokumen, MongoDB bisa menjadi pilihan yang baik.

  • Jika Anda lebih suka membayangkan data Anda sebagai sekelompok tabel yang saling berhubungan, MongoDB mungkin bukan pilihan yang baik.

Berikut adalah dua contoh yang saya temukan ilustratif:

  • Beberapa tahun yang lalu, saya membuat mesin blog. Tujuannya adalah untuk meng-host artikel blog, dan untuk setiap artikel, menyimpan versi yang berbeda, beberapa metadata, statistik kunjungan, dll.

    Ini dapat disimpan sebagai banyak tabel, tetapi ketika mencoba membangun model, ia tumbuh sangat cepat menjadi selusin tabel, jika tidak lebih. Beberapa query SQL bisa menjadi jelek dengan banyak joins, dan ... yah, Anda mendapatkan gambarannya.

    Masalahnya di sini adalah bahwa ada hal utama - artikel blog - dan ada semua hal di sekitar artikel ini, yang membuatnya cocok untuk basis data berbasis dokumen. Dengan MongoDB, memodelkan basis data sangat mudah: satu koleksi menampung artikel blog, dan koleksi kecil kedua berisi daftar pengguna yang diizinkan menulis artikel. Setiap dokumen dalam koleksi pertama akan berisi semua informasi yang saya butuhkan saat menampilkan artikel, apakah itu nama penulis, atau tag.

  • Sekarang bayangkan proyek yang sangat berbeda. Ada beberapa pengguna yang dapat menulis hal-hal, dan berbagi hal-hal yang ditulis oleh pengguna lain. Pada halaman pengguna, Anda akan menemukan kedua hal yang ditulis pengguna ini dan yang dibagikannya. Ada satu kendala: ketika seseorang mengedit apa yang dia tulis di masa lalu, perubahan muncul di mana-mana di mana teks asli dibagikan.

    Dengan pendekatan berbasis dokumen, sulit untuk menemukan apa yang akan menjadi dokumen. Seorang pengguna mungkin? Ya, itu awal yang bagus. Dokumen pengguna akan berisi semua hal yang ditulis pengguna ini. Tetapi bagaimana dengan hal-hal yang dia bagikan?

    Cara yang mungkin adalah dengan meletakkan barang-barang itu di dokumen yang sama. Masalah dengan pendekatan ini adalah bahwa jika seseorang mengedit entri, aplikasi harus berjalan melalui setiap dokumen pengguna dalam database untuk mengedit setiap kemunculan entri lama. Tidak menghitung duplikasi data.

    Alternatifnya adalah menyimpan dalam dokumen pengguna hanya daftar entri yang dibagikan oleh pengguna ini (dengan ID dari pengguna dan entri yang dirujuk). Tapi sekarang, masalah yang berbeda akan terjadi: jika pengguna berbagi ribuan entri dari ribuan pengguna, itu akan perlu membuka ribuan dokumen untuk mendapatkan entri tersebut.

    Atau kami dapat memodelkan koleksi kami di sekitar entri itu sendiri, masing-masing entri merujuk pada pembuatnya dan memiliki daftar pengguna yang membagikannya. Di sini sekali lagi, masalah kinerja dapat menjadi nyata ketika Anda harus memeriksa semua dokumen untuk menunjukkan yang diterbitkan oleh pengguna tertentu.

    Sekarang, berapa banyak tabel yang Anda perlukan jika Anda menggunakan basis data relasional? Benar tiga. Akan mudah untuk model, dan juga mudah digunakan.

Arseni Mourzenko
sumber
Jawaban ini perlu diperbarui karena sekarang MongoDB sejak versi 4.0 mengklaim untuk menerapkan ACID, meskipun Python dan Java API untuk multitransaksi mongodb.com/blog/post/…
Carmine
@Carmine: Saya tidak memiliki cukup pengetahuan untuk memberikan jawaban yang diperbarui. Bisakah Anda (1) memposting jawaban Anda di bawah dan (2) menambahkan komentar di sini setelah Anda melakukannya, jadi saya menambahkan penafian atas jawaban saya dengan tautan ke Anda, dengan mengatakan bahwa ini tidak lagi berlaku mulai dari MongoDB 4?
Arseni Mourzenko
9

Setiap teknologi memiliki kelebihannya.

Keuntungan dari basis data relasional adalah bahwa RDBMS melakukan beberapa hal untuk Anda, seperti:

  • Menegakkan integritas referensial (tidak mengizinkan penyisipan detail faktur jika faktur yang dimiliki tidak ada)
  • Hindari redundansi: barang disimpan hanya sekali.
  • Kueri kompleks dapat dilakukan dengan bahasa deklaratif (SQL) yang matang, terbukti waktu, dan tersebar luas.

Semua itu bermuara pada kenyataan bahwa Anda harus menulis lebih sedikit kode karena RDBMS memberlakukan banyak hal untuk Anda.

Selain itu, kemandirian data: sering kali jika Anda menggunakan struktur SQL standar dan tidak ada yang khusus vendor, Anda dapat memigrasikan data Anda dari satu RDBMS ke yang lain dengan kerumitan minimal, sedangkan database NOSQL tidak distandarisasi sama sekali.

Di sisi lain, salah satu kelebihan dari database NOSQL adalah bahwa mereka meningkatkan skala kinerja yang lebih baik untuk jutaan baris. Mereka lebih cocok untuk penyimpanan berbasis dokumen, yaitu data yang tidak terstruktur. Tetapi sebagian besar aplikasi tidak memerlukan fitur ini.

Tulains Córdova
sumber
5
Kurang transaksi MongoDB adalah kerugian besar . Harus khawatir tentang kondisi ras sepanjang waktu adalah rasa sakit di pantat.
CodesInChaos
1
Catatan: MongoDB mendukung transaksi ACID sekarang.
Milan Velebit
5

Untuk kasus khusus Anda, MongoDB terdengar seperti pilihan yang baik, tetapi ada banyak skenario (mungkin sebagian besar dari mereka) di mana itu tidak akan menjadi pilihan terbaik.

MongoDB lebih cocok dalam skenario yang menuntut untuk membaca / menulis banyak data, tanpa banyak penekanan pada keamanan transaksi (jika beberapa data kadang-kadang hilang dalam server crash, itu bukan masalah besar), berharap untuk skala besar, dan jangan t benar-benar memiliki skema yang stabil.

MongoDB tidak cocok untuk skenario yang membutuhkan:

  1. Jaminan ACID yang kuat: MongoDB memungkinkan data duplikat disimpan, pembacaan tidak konsisten, dan bahkan kehilangan data. Hal-hal ini baik di beberapa aplikasi, tetapi tidak di sebagian besar.
  2. Transaksi Multi-Obyek: MongoDB mendukung transaksi ACID, tetapi hanya untuk satu objek / dokumen. Ini tidak akan memotongnya untuk operasi yang lebih kompleks seperti transfer bank, membuat reservasi, dll.
  3. BI Tradisional: ada banyak alat BI di luar sana yang hanya cocok dengan SQL tradisional.
  4. SQL: MongoDB memiliki bahasa query yang sangat spesifik, sedangkan SQL sangat dikenal oleh banyak orang (mungkin merupakan aspek penting untuk dipertimbangkan), dapat melakukan banyak hal kompleks (sedangkan dengan MongoDB Anda akan kesulitan melakukan yang sederhana bergabung) dan dapat ditransfer di banyak implementasi.

MongoDB lebih cepat dan akan memungkinkan Anda untuk meningkatkan kinerja lebih dari sistem dengan menghilangkan banyak hal yang RDBMS terapkan secara default, seperti pemeriksaan integritas (catat bahwa Anda juga dapat mengubah RDBMS untuk tujuan seperti itu), tetapi kenyataannya adalah, dalam kebanyakan skenario, itu tidak diperlukan. Plus, trade-off adalah keandalan dan fleksibilitas (Anda akan mengalami kesulitan jika, nanti, Anda memutuskan untuk melakukan operasi yang lebih kompleks dengan data yang ada).

Itu semua tergantung pada kebutuhan aplikasi yang Anda bangun. Apakah itu kecepatan dan ketersediaan, atau keamanan, keandalan, dan fleksibilitas. Anda harus tahu di mana di data Anda (dan di koneksi data Anda) terletak nilai lebih. Jika Anda belum tahu, mungkin yang terbaik adalah jika Anda memilih sesuatu yang tidak akan membuat Anda kesal di masa depan, dan akan memungkinkan Anda untuk menambahkan fitur dan melakukan operasi yang dibutuhkan aplikasi Anda.

snickro
sumber
3

MongoDB sangat bagus ketika Anda dapat mewakili data Anda sebagai "paket" informasi independen. Anda memiliki google maps kode ZIP, tertanam dalam kode ZIP adalah perusahaan dan di dalam perusahaan adalah karyawan. Semua kode pos bersifat independen satu sama lain dan Anda dapat memperoleh seluruh informasi dengan cara yang sederhana, cantik, dan cepat. Itu adalah skenario yang bagus untuk solusi nonSQL.

Setelah mengatakan itu, saya benar-benar tidak setuju dengan tren saat ini yang saya cari yang menyiratkan bahwa MongoDB adalah jenis posting dan solusi superior untuk RDBMS dan noSQL harus menjadi solusi Anda secara default. Semua itu absurd. MongoDB adalah basis data ceruk dan 90% proyek bersifat relasional dan memerlukan opsi RDBMS karena Anda menginginkan solusi kueri yang kuat seperti SQL untuk menghasilkan laporan dan mencari data bubar: "bergabung" adalah pro, bukan penipu. Selain itu, RDBMS modern mendukung koleksi BSON dan integrasi geospasial sehingga mungkin ceruk untuk noSQL bahkan lebih sempit sekarang.

aarkerio
sumber
2

MongoDB berguna untuk menyimpan seluruh data terstruktur yang diperlukan untuk membangun contoh halaman web. Anda dapat mengambil data untuk halaman tertentu, meneruskannya ke aplikasi klien Anda yang kemudian dapat merendernya.

Dalam konteks seperti itu, MongoDB sangat cepat dan dapat diandalkan. Tetapi jangan pernah lupa Anda tidak memiliki informasi relasional dalam database Anda. Yang berarti jika Anda mengubah sesuatu dalam struktur halaman web Anda, Anda mungkin tidak dapat mengisi lubang di halaman yang sudah disimpan karena Anda tidak memiliki data yang diperlukan untuk melakukannya. Lebih lanjut tentang ini di sini: http://www.sarahmei.com/blog/2013/11/11/why-you-should-never-use-mongodb/

Alexis Dufrenoy
sumber