เป็นความคิดที่ดีที่จะใช้ฐานข้อมูลเดียวสำหรับร้านค้ากว่า 50,000 แห่งหรือไม่?


10

ฉันรู้ว่า Shopify ใช้ฐานข้อมูลเดียวเท่านั้นสำหรับร้านค้าทั้งหมด แต่พวกเขาสามารถจัดการฐานข้อมูลด้วยข้อมูลขนาดใหญ่ได้อย่างไร เป็นความคิดที่ดีที่จะใช้ฐานข้อมูลเดียวสำหรับร้านค้ากว่า 50,000 แห่งหรือไม่?


11
RDBMS ที่ทันสมัยสามารถจัดการกับแถว 100 พันล้านแถว ไม่ใช่ปัญหาเลยหากทุกอย่างถูกออกแบบมาเพื่อปรับขนาดและฮาร์ดแวร์ที่เหมาะสมอยู่ในสถานที่เพื่อจัดการกับโหลด
Philᵀᴹ

คำตอบ:


23

โปรดทราบ: ฉันกำลังตอบจากมุมมองของ SQL Server ดังนั้นฉันพูดถึงแนวคิดบางอย่างที่เฉพาะเจาะจงกับ SQL Server แต่ฉันเชื่อว่าแนวคิดเหล่านี้ทั้งหมดมีความเทียบเท่าในแพลตฟอร์ม RDBMS หลักอื่น ๆ ที่มีข้อดีและข้อ จำกัด ที่คล้ายคลึงกัน

ฉันอาจจะแก้ไขคำตอบนี้ต่อไปเพราะฉันนึกถึงข้อดีข้อเสียอื่น ๆ

มันขึ้นอยู่กับสคีมาปริมาณ ฯลฯ ที่ร้านค้าเก็บคืออะไร มันแตกต่างจากการจัดเก็บข้อมูลประมาณ 50,000 แมวหรือ 50,000 ผลิตภัณฑ์หรือ 50,000 wingnuts อย่างไร

มีเหตุผลหลายประการ (นอกเหนือจากขนาดของมันเอง) ทำไมคุณไม่ต้องการจัดเก็บข้อมูลสำหรับลูกค้า 50,000 รายในฐานข้อมูลเดียวหากลูกค้าสามารถแยกข้อมูลได้อย่างสมบูรณ์ (ไม่รวมตารางการค้นหาเช่นรหัส zip หรือ ตารางเฉพาะแอปพลิเคชันซึ่งสามารถไปที่ฐานข้อมูลส่วนกลางเดียว):

  • หากลูกค้าเติบโตเกินกว่าโปรแกรมที่ไม่มีวิธีง่ายๆในการแยกเพียงข้อมูลของพวกเขาและย้ายไปยังอีกเช่นเซิร์ฟเวอร์และอื่น ๆ ที่จะไต่ออกจนกว่าคุณจะวางแผนล่วงหน้าและพาร์ทิชันในสิ่งที่ชอบCustomerIDและมี 50,000 filegroups (คุณจำกัด ถึง 15,000 พาร์ติชันหรือ 1,000 ถ้าคุณใช้ SQL Server เวอร์ชันเก่าและมีกลุ่มไฟล์มากเกินไปอาจทำให้เกิดความเสียหายได้ ) โปรดทราบว่าการแบ่งพาร์ติชันต้องใช้ Enterprise Edition

  • หากปรากฎว่าลูกค้าของคุณใหญ่เกินไปสำหรับอินสแตนซ์นี้การขยายออกหมายถึงการรับฮาร์ดแวร์ใหม่และย้ายฐานข้อมูลทั้งหมดที่นั่น (และอาจทำเช่นนั้นอีกครั้งตามถนน)

  • การลบลูกค้าอาจเจ็บปวดอย่างเท่าเทียมกันเนื่องจากคุณจะต้องลบบาง% ของแถวออกจากตารางที่มีขนาดใหญ่มากและนั่นจะไม่ถูก

  • คุณอาจมีการกระจายข้อมูลลูกค้าอย่างกว้างขวาง (ลูกค้ารายหนึ่งพันล้านแถวและลูกค้า 5,000 ราย) สิ่งนี้สามารถนำไปสู่สิ่งต่าง ๆ เช่นการดมพารามิเตอร์และประสิทธิภาพที่เป็นอันตรายที่เกี่ยวข้องกับความสำคัญเชิงหัวใจและคุณภาพของแผน (เนื่องจากคุณอาจจะใช้แผนเดียวกันสำหรับการสืบค้นเดียวกันกับชุดข้อมูลที่แตกต่างกันมาก)

  • ลูกค้าของคุณทั้งหมดต้องอยู่ภายใต้แผน SLA และ HA / DR ที่แน่นอน คุณมีฐานข้อมูลทั้งหมดในโหมดการกู้คืนเต็มรูปแบบด้วยการสำรองข้อมูลบันทึกแบบนาทีต่อนาทีหรือคุณอยู่ในรูปแบบที่เรียบง่ายและใช้การสำรองข้อมูลเต็มรูปแบบ + diff หากคุณต้องเปลี่ยนกลับเนื่องจากข้อผิดพลาดของลูกค้าหรือจำเป็นต้องกู้คืนฐานข้อมูลเป็นระยะเวลาหนึ่งซึ่งจะส่งผลต่อลูกค้าทุกราย

  • มีความเป็นไปได้ที่จะเกิดข้อผิดพลาดในการดึงข้อมูล - ข้อบกพร่องในกรณีที่ส่วนคำสั่งอาจนำไปสู่ลูกค้ารายหนึ่งที่เห็นข้อมูลลูกค้าอื่นหรือข้อมูลลูกค้าอื่น ๆ ทั้งหมด

  • อาจมีผลทางกฎหมาย (บาง บริษัท จะมีข้อกำหนดที่เข้มงวดในสถานที่ซึ่งคุณไม่ได้วางข้อมูลไว้ในฐานข้อมูลเดียวกับ บริษัท อื่นและโดยเฉพาะอย่างยิ่งคู่แข่งของพวกเขา)

  • หากการรักษาความปลอดภัยของข้อมูลของลูกค้าคนใดคนหนึ่งมีความสำคัญการบรรลุเป้าหมายนั้นง่ายกว่าการแยกฐานข้อมูลมากกว่าการแยกภายในตาราง


ข้อได้เปรียบบางประการในการมีลูกค้าแต่ละรายในฐานข้อมูลแยกต่างหาก (หรืออย่างน้อยก็มีหลายฐานข้อมูลแต่ละกลุ่มลูกค้า):

  • ในแง่ของขนาดมันจะใช้เวลาประมาณขนาดเดียวกันบนดิสก์
  • การขยายออกทำได้ง่ายขึ้นเนื่องจากคุณสามารถย้ายฐานข้อมูล (หรือหลาย ๆ ) ไปยังเซิร์ฟเวอร์อื่น
  • DROP DATABASEลบลูกค้าและข้อมูลทั้งหมดประมาณเท่ากับ
  • คุณกำลังใช้หน่วยความจำเพิ่มเติมสำหรับแผน (หรือคุณมีแผนแคชน้อยกว่าต่อลูกค้า) แต่อย่างน้อยแผนเหล่านั้นเกี่ยวข้องกับข้อมูลในฐานข้อมูลที่เกี่ยวข้องและมีแนวโน้มที่จะเกิดปัญหาด้านสถิติ / พารามิเตอร์การดมกลิ่นน้อยลง
  • คุณสามารถมีแผน SLA และ DR ที่แตกต่างกันได้อย่างง่ายดายโดยวางฐานข้อมูลบางส่วนไว้ในแบบเต็ม การคืนค่าหรือการกู้คืนสู่ช่วงเวลาหนึ่งส่งผลกระทบต่อลูกค้ารายนั้นเท่านั้น
  • คุณสามารถวางฐานข้อมูลที่แตกต่างกัน (เช่นลูกค้าที่มีลำดับความสำคัญสูง) ได้อย่างรวดเร็วบน I / O คุณสามารถทำสิ่งนี้ได้ในฐานข้อมูลเดียวกับกลุ่มไฟล์ แต่นั่นเป็นเรื่องยากมากที่จะจัดการ (อย่างน้อย IMHO)

ข้อเสียบางอย่าง:

  • ขนาดกันคุณอาจไม่ต้องการมีฐานข้อมูล 50,000 บนอินสแตนซ์เดียวของ SQL Server ดังนั้นนี่อาจหมายถึงการขยายไปยังเซิร์ฟเวอร์หลาย ๆ ตัว
  • เวลาเริ่มต้นทำงานเพิ่มขึ้นเนื่องจากมีค่าใช้จ่ายในการเริ่มต้นแต่ละฐานข้อมูล
  • แอพต้องฉลาดกว่าเดิม - แทนที่จะต้องมี CustomerID ในส่วนคำสั่งมันต้องเชื่อมต่อกับฐานข้อมูลของลูกค้าแบบไดนามิก นี่ไม่ใช่เรื่องยากสำหรับเทียร์กลางที่เหมาะสม แต่เป็นการเปลี่ยนแปลง
  • ใช่คุณมีสำเนาของตารางและโพรซีเดอร์เดียวกันจำนวนมาก แต่โค้ดและสคีมานั้นเหมือนกันในฐานข้อมูลเพียงแค่ข้อมูลนั้นแตกต่างกัน ดังนั้นการปรับใช้การเปลี่ยนแปลงรหัส / สคีมาจึงเป็นเพียงการวนซ้ำแทนที่จะเป็นการประมวลผลครั้งเดียว
  • การบำรุงรักษาจะแตกต่างกันเล็กน้อยเมื่อคุณจัดการฐานข้อมูล 50,000 ครั้ง - ขนาดโดยรวมค่อนข้างเท่าเดิม แต่กระบวนการเปลี่ยนไป - คุณไม่สามารถจัดเรียงข้อมูล / ทำดัชนี / สำรองข้อมูลฐานข้อมูลทั้งหมด 50,000 รายการพร้อมกันได้ ต้องบอกว่าที่งานก่อนหน้าของฉันฉันจัดการอินสแตนซ์กับฐานข้อมูลที่เหมือนกัน 500-1,000 และความแตกต่างระหว่างการจัดการฐานข้อมูลที่เหมือนกัน 3 และฐานข้อมูลที่เหมือนกัน 750 เป็นเพียงเวลาที่ใช้

2
+ 1. ตอนนี้เรามาเริ่มอ่านคำตอบ :-)
Marian
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.