ฉันรู้ว่ามีคำถามที่คล้ายกันที่นี่ แต่พวกเขามีทั้งบอกฉันเปลี่ยนกลับไปใช้ระบบ RDBMS ปกติถ้าผมต้องทำธุรกรรมหรือใช้การดำเนินงานของอะตอมหรือสองเฟสกระทำ ทางออกที่สองดูเหมือนจะเป็นทางเลือกที่ดีที่สุด ข้อที่สามฉันไม่ต้องการติดตามเพราะดูเหมือนว่ามีหลายสิ่งผิดปกติและฉันไม่สามารถทดสอบได้ในทุกด้าน ฉันมีเวลาในการปรับโครงสร้างโครงการของฉันอีกครั้งเพื่อดำเนินการปรมาณู ฉันไม่ทราบว่าสิ่งนี้มาจากมุมมองที่ จำกัด ของฉัน (ฉันเพิ่งทำงานกับฐานข้อมูล SQL จนถึงปัจจุบัน) หรือไม่สามารถทำได้จริง ๆ หรือไม่
เราต้องการทดสอบนำร่อง MongoDB ที่ บริษัท ของเรา เราเลือกโครงการง่ายๆ - เกตเวย์ SMS ช่วยให้ซอฟต์แวร์ของเราส่งข้อความ SMS ไปยังเครือข่ายเซลลูลาร์และเกตเวย์ทำงานได้ไม่ดี: สื่อสารกับผู้ให้บริการผ่านโปรโตคอลการสื่อสารที่แตกต่างกัน เกตเวย์ยังจัดการการเรียกเก็บเงินของข้อความด้วย ลูกค้าทุกคนที่สมัครใช้บริการจะต้องซื้อเครดิตบ้าง ระบบจะลดยอดคงเหลือของผู้ใช้โดยอัตโนมัติเมื่อมีการส่งข้อความและปฏิเสธการเข้าถึงหากยอดเงินไม่เพียงพอ และเนื่องจากเราเป็นลูกค้าของผู้ให้บริการ SMS บุคคลที่สามเราจึงอาจมียอดคงเหลือเป็นของตนเอง เราต้องติดตามสิ่งเหล่านั้นด้วย
ฉันเริ่มคิดว่าฉันสามารถจัดเก็บข้อมูลที่ต้องการด้วย MongoDB ได้อย่างไรหากฉันลดความซับซ้อนลง (การเรียกเก็บเงินภายนอกการส่ง SMS ที่อยู่ในคิว) มาจากโลก SQL ฉันจะสร้างตารางแยกต่างหากสำหรับผู้ใช้อีกอันหนึ่งสำหรับข้อความ SMS และอีกอันสำหรับจัดเก็บธุรกรรมที่เกี่ยวข้องกับยอดคงเหลือของผู้ใช้ สมมติว่าฉันสร้างคอลเลกชันแยกสำหรับทุกคนใน MongoDB
ลองนึกภาพงานส่ง SMS ด้วยขั้นตอนต่อไปนี้ในระบบที่เรียบง่ายนี้:
ตรวจสอบว่าผู้ใช้มียอดคงเหลือเพียงพอหรือไม่ ปฏิเสธการเข้าถึงหากมีเครดิตไม่เพียงพอ
ส่งและจัดเก็บข้อความในการรวบรวม SMS พร้อมรายละเอียดและค่าใช้จ่าย (ในระบบถ่ายทอดสดข้อความจะมี
status
คุณสมบัติและงานจะรับส่งและกำหนดราคาของ SMS ตามสถานะปัจจุบัน)ลดยอดคงเหลือของผู้ใช้โดยค่าใช้จ่ายของข้อความที่ส่ง
บันทึกธุรกรรมในการรวบรวมทรานแซคชัน
ทีนี้ปัญหาของมันคืออะไร? MongoDB สามารถอัปเดตอะตอมมิกได้ในเอกสารเดียวเท่านั้น ในโฟลว์ก่อนหน้านี้อาจเกิดขึ้นได้ว่ามีข้อผิดพลาดบางอย่างเกิดขึ้นและข้อความได้รับการจัดเก็บในฐานข้อมูล แต่ยอดคงเหลือของผู้ใช้ไม่ได้รับการอัพเดตและ / หรือธุรกรรมไม่ได้ถูกบันทึกไว้
ฉันคิดสองแนวคิด:
สร้างคอลเล็กชันเดี่ยวสำหรับผู้ใช้และเก็บยอดคงเหลือเป็นฟิลด์ธุรกรรมที่เกี่ยวข้องกับผู้ใช้และข้อความเป็นเอกสารย่อยในเอกสารของผู้ใช้ เนื่องจากเราสามารถอัปเดตเอกสารแบบอะตอมนี่แก้ปัญหาธุรกรรมได้จริง ข้อเสีย: หากผู้ใช้ส่งข้อความ SMS จำนวนมากขนาดของเอกสารอาจมีขนาดใหญ่และถึงขีด จำกัด เอกสาร 4MB บางทีฉันสามารถสร้างเอกสารประวัติในสถานการณ์เช่นนี้ แต่ฉันไม่คิดว่านี่จะเป็นความคิดที่ดี นอกจากนี้ฉันไม่ทราบว่าระบบจะรวดเร็วแค่ไหนหากฉันส่งข้อมูลมากขึ้นไปยังเอกสารขนาดใหญ่เดียวกัน
สร้างหนึ่งคอลเลกชันสำหรับผู้ใช้และอีกหนึ่งสำหรับการทำธุรกรรม การทำธุรกรรมมีสองประเภท: การซื้อเครดิตที่มีการเปลี่ยนแปลงยอดคงเหลือเป็นบวกและข้อความที่ส่งพร้อมการเปลี่ยนแปลงยอดคงเหลือติดลบ ธุรกรรมอาจมีเอกสารย่อย ตัวอย่างเช่นในข้อความที่ส่งรายละเอียดของ SMS สามารถฝังในการทำธุรกรรม ข้อเสีย: ฉันไม่เก็บยอดคงเหลือผู้ใช้ปัจจุบันดังนั้นฉันต้องคำนวณทุกครั้งที่ผู้ใช้พยายามส่งข้อความเพื่อบอกว่าข้อความสามารถผ่านได้หรือไม่ ฉันเกรงว่าการคำนวณนี้จะช้าลงเมื่อจำนวนธุรกรรมที่เก็บไว้เพิ่มขึ้น
ฉันสับสนเล็กน้อยเกี่ยวกับวิธีการเลือก มีวิธีแก้ไขปัญหาอื่น ๆ อีกไหม? ฉันไม่พบแนวทางปฏิบัติที่ดีที่สุดทางออนไลน์เกี่ยวกับวิธีแก้ไขปัญหาประเภทนี้ ฉันเดาว่าโปรแกรมเมอร์หลายคนที่พยายามทำความคุ้นเคยกับโลก NoSQL กำลังเผชิญกับปัญหาที่คล้ายคลึงกันในตอนแรก