บริษัทของฉันใช้ฐานข้อมูล NoSQL (Mongo) สำหรับผลิตภัณฑ์ของตน อย่างไรก็ตาม ผลิตภัณฑ์ของพวกเขาทำงานช้าอย่างไม่น่าเชื่อ ซึ่งอาจเนื่องมาจากประสิทธิภาพของโค้ดหรือ/และการออกแบบฐานข้อมูลแม้ว่าฉันจะไม่ได้จ้างเป็น dev หรือ sysadmin และไม่มีผู้เชี่ยวชาญในการออกแบบ DB แต่ฉันพบว่าสิ่งหลังน่าสนใจมากและคิดว่ามันน่าสนใจที่จะดูว่าความคิดเห็นของฉันเกี่ยวกับการออกแบบ db นั้นถูกต้องหรือไม่ถูกต้องอย่างไร
สิ่งสำคัญที่ดึงดูดสายตาของฉันมีดังต่อไปนี้:
ฐานข้อมูลมีคอลเลกชันที่แตกต่างกันค่อนข้างน้อย โดยพื้นฐานแล้ว "วัตถุ" ที่แตกต่างกันทุกประเภทในระบบของเรามีคอลเล็กชัน (มากหรือน้อย) สำหรับฉันแล้ว ดูเหมือนว่าจะคล้ายกับฐานข้อมูลแบบ SQL มาก ซึ่งคุณบันทึกลิงก์ระหว่างออบเจ็กต์แล้วค้นหาจากหลายตารางพร้อมกันเท่านั้น อย่างไรก็ตาม ฉันคิดว่าข้อดีของ NoSQL คือวิธีการรวบรวมข้อมูลแบบรวมข้อมูลทั้งหมดแบบไม่มีโครงสร้างและเป็นแบบเดียวกันจะช่วยให้สามารถค้นหาข้อมูลได้เร็วขึ้นโดยมีโครงสร้างที่ยุ่งเหยิง ในการสุ่มตัวอย่าง: สมมติว่าคุณมีบัญชีธนาคารในแอป และอาจมีธุรกรรมระหว่างบัญชี สำหรับฉัน สไตล์ SQL จะมีสองตารางแยกกัน หนึ่งตารางสำหรับบัญชีและอีกตารางหนึ่งสำหรับธุรกรรม ฉันคิดว่าสไตล์ NoSQL จะใส่ธุรกรรมที่เกี่ยวข้องไว้ใต้การรวบรวมบัญชีที่เหมาะสมแทน ออบเจกต์และโครงสร้างจริงในโค้ดเบสของเรานั้นซับซ้อนกว่ามาก ดังนั้นฉันจึงเข้าใจถึงความต้องการคอลเล็กชันที่มากขึ้น แต่ฉันแค่คิดว่าบางทีมันอาจจะมากเกินไป
นอกเหนือจากการแยกคอลเล็กชันแล้ว ดูเหมือนว่าเราจะทำการค้นหาแยกต่างหากจำนวนมากในคอลเล็กชันเหล่านั้น แม้ว่าคอลเล็กชันเหล่านั้นจะเชื่อมโยงกันในเชิงความหมายก็ตาม ฉันคิดถูกหรือไม่ว่าขั้นตอนนี้จะช้ากว่าคำขอเข้าร่วมที่เลียนแบบ
คำถามทั่วไปเพิ่มเติม: codebase นั้นใหญ่เกินไปสำหรับฉันที่จะทำความเข้าใจระบบของเราอย่างถ่องแท้ โดยเฉพาะอย่างยิ่งเมื่อฉันไม่ได้อยู่ในบทบาทนักพัฒนา แต่มีสิ่งใดบ้างที่ฉันสามารถทำได้เพื่อดูว่าข้อความค้นหาใดที่อาจทำได้อย่างรวดเร็ว มีโครงสร้างไม่ดี?
เรามีเซิร์ฟเวอร์ DB หลายตัว ซึ่งหนึ่งในนั้นเป็นเซิร์ฟเวอร์หลัก และอีกเซิร์ฟเวอร์หนึ่งจำลองต้นแบบเพื่อเป็นข้อมูลสำรองในกรณีที่เกิดความล้มเหลวเรายังมีสำเนาของระบบของเราจำนวนมากที่เข้าถึงฐานข้อมูลเดียวกันเหล่านั้น (อืม ฐานข้อมูลต่างกันในทางเทคนิค แต่พวกมันทำงานบนเซิร์ฟเวอร์เดียวกัน) บางครั้งสิ่งนี้สร้างการเชื่อมต่อพร้อมกันมากมาย จะดีกว่าไหมหากแยก "ฐานข้อมูลใดเป็นฐานข้อมูลหลัก" ระหว่างระบบ และทำการคัดลอกข้อมูลเมื่อโหลดเหลือน้อย ตัวอย่างเช่น สมมติว่าฉันมีเซิร์ฟเวอร์ฐานข้อมูล 3 เครื่องและอินสแตนซ์ระบบ 3 รายการ ในขณะนี้ ทั้ง 3 ระบบเข้าถึงฐานข้อมูลหลักเดียวกัน ซึ่งจะถูกจำลองแบบบนโหนดอื่นอีก 2 โหนด จะดีกว่าไหมที่จะกำหนดเซิร์ฟเวอร์ DB หนึ่งเครื่องต่อระบบเป็นมาสเตอร์ เพื่อให้การเชื่อมต่อถูกแยกระหว่างเซิร์ฟเวอร์
ฉันรู้ว่าคำถามของฉันค่อนข้างคลุมเครือ แต่อย่างที่ฉันพูด หัวข้อต่างๆ ทำให้ฉันสนใจ แม้ว่าฉันจะไม่มีวิธีเพิ่มรายละเอียดมากมายให้กับคำถามของฉัน