Saya tahu ada pertanyaan serupa di sini, tetapi mereka mengatakan kepada saya untuk kembali ke sistem RDBMS biasa jika saya memerlukan transaksi atau menggunakan operasi atom atau komit dua fase . Solusi kedua sepertinya pilihan terbaik. Yang ketiga saya tidak ingin mengikuti karena tampaknya banyak hal bisa salah dan saya tidak bisa mengujinya di setiap aspek. Saya mengalami kesulitan refactoring proyek saya untuk melakukan operasi atom. Saya tidak tahu apakah ini berasal dari sudut pandang saya yang terbatas (saya hanya bekerja dengan database SQL sejauh ini), atau apakah itu sebenarnya tidak dapat dilakukan.
Kami ingin menguji coba MongoDB di perusahaan kami. Kami telah memilih proyek yang relatif sederhana - SMS gateway. Ini memungkinkan perangkat lunak kami untuk mengirim pesan SMS ke jaringan seluler dan gateway melakukan pekerjaan kotor: benar-benar berkomunikasi dengan penyedia melalui protokol komunikasi yang berbeda. Gateway juga mengelola penagihan pesan. Setiap pelanggan yang mengajukan permohonan layanan harus membeli sejumlah kredit. Sistem secara otomatis mengurangi saldo pengguna ketika pesan dikirim dan menolak akses jika saldo tidak mencukupi. Juga karena kami adalah pelanggan penyedia SMS pihak ketiga, kami mungkin juga memiliki saldo sendiri. Kita harus melacak itu juga.
Saya mulai berpikir tentang bagaimana saya bisa menyimpan data yang diperlukan dengan MongoDB jika saya mengurangi beberapa kerumitan (penagihan eksternal, pengiriman SMS antri). Berasal dari dunia SQL, saya akan membuat tabel terpisah untuk pengguna, satu lagi untuk pesan SMS, dan satu lagi untuk menyimpan transaksi mengenai saldo pengguna. Katakanlah saya membuat koleksi terpisah untuk semua yang ada di MongoDB.
Bayangkan tugas pengiriman SMS dengan langkah-langkah berikut dalam sistem yang disederhanakan ini:
periksa apakah pengguna memiliki saldo yang cukup; tolak akses jika tidak ada kredit yang cukup
kirim dan simpan pesan dalam koleksi SMS dengan perincian dan biaya (dalam sistem siaran langsung pesan akan memiliki
status
atribut dan tugas akan mengambilnya untuk pengiriman dan mengatur harga SMS sesuai dengan keadaan saat ini)mengurangi saldo pengguna dengan biaya pesan yang dikirim
catat transaksi dalam koleksi transaksi
Sekarang apa masalahnya dengan itu? MongoDB dapat melakukan pembaruan atom hanya pada satu dokumen. Dalam aliran sebelumnya, bisa terjadi beberapa jenis kesalahan masuk dan pesan disimpan dalam basis data tetapi saldo pengguna tidak diperbarui dan / atau transaksi tidak dicatat.
Saya datang dengan dua ide:
Buat koleksi tunggal untuk pengguna, dan simpan saldo sebagai bidang, transaksi terkait pengguna dan pesan sebagai sub dokumen dalam dokumen pengguna. Karena kami dapat memperbarui dokumen secara atom, ini sebenarnya memecahkan masalah transaksi. Kekurangan: jika pengguna mengirim banyak pesan SMS, ukuran dokumen bisa menjadi besar dan batas dokumen 4MB dapat tercapai. Mungkin saya bisa membuat dokumen sejarah dalam skenario seperti itu, tapi saya rasa ini bukan ide yang bagus. Saya juga tidak tahu seberapa cepat sistemnya jika saya mendorong lebih banyak data ke dokumen besar yang sama.
Buat satu koleksi untuk pengguna, dan satu untuk transaksi. Ada dua jenis transaksi: pembelian kredit dengan perubahan saldo positif dan pesan yang dikirim dengan perubahan saldo negatif. Transaksi dapat memiliki sub dokumen; misalnya dalam pesan yang dikirim rincian SMS dapat tertanam dalam transaksi. Kekurangan: Saya tidak menyimpan saldo pengguna saat ini jadi saya harus menghitungnya setiap kali pengguna mencoba mengirim pesan untuk memberi tahu apakah pesan itu bisa masuk atau tidak. Saya khawatir perhitungan ini dapat menjadi lambat karena jumlah transaksi yang tersimpan bertambah.
Saya sedikit bingung tentang metode mana yang harus dipilih. Apakah ada solusi lain? Saya tidak dapat menemukan praktik terbaik online tentang cara mengatasi masalah seperti ini. Saya kira banyak programmer yang mencoba mengenal dunia NoSQL menghadapi masalah yang sama pada awalnya.