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


10

นี่คือกึ่งสมมุติและเนื่องจากฉันไม่เคยมีประสบการณ์ในการจัดการกับตารางฐานข้อมูลขนาดใหญ่ฉันจึงไม่ทราบว่ามันน่ากลัวด้วยเหตุผลบางประการ ตามสถานการณ์:

ลองนึกภาพแอปพลิเคชันบนเว็บ - สมมติว่าซอฟต์แวร์บัญชีซึ่งมีลูกค้า 20,000 รายและลูกค้าแต่ละรายมีรายการมากกว่า 1,000 รายการในตาราง นั่นคือ 20 ล้านแถวซึ่งฉันรู้ว่าสามารถชะลอการค้นหาที่ซับซ้อนได้อย่างแน่นอน

ในกรณีเช่นนี้การสร้างตารางใหม่ในฐานข้อมูลสำหรับไคลเอ็นต์แต่ละเครื่องเหมาะสมหรือไม่ ฐานข้อมูลมีปฏิกิริยาอย่างไรกับการมีตารางขนาด 20k (หรือมากกว่านั้น)?

คำตอบ:


15

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

กรณีที่เลวร้ายยิ่งกว่านั้นหากคุณพบว่าขนาดฐานข้อมูลกำลังเป็นปัญหาคุณสามารถแยกขนาดออกเป็นฐานข้อมูลแยกต่างหากในภายหลัง


ไม่ฉันหมายถึงตารางภายในฐานข้อมูลจริงๆ ฉันไม่สามารถจินตนาการเหตุผลในการสร้างฐานข้อมูลต่อลูกค้า และถ้า 20 ล้านแถวมีขนาดเล็กอะไรใหญ่? และคุณทำอะไรที่จุดนั้น?
จะ

1
@ChrisF ตรง - มีหลายกรณีที่เทคโนโลยีหรือรูปแบบธุรกิจเรียกร้องให้แยก DB ต่อลูกค้าแต่ละราย แต่ฉันไม่สามารถคิดเหตุผลที่แยกตารางภายในฐานข้อมูลเดียวกัน
GrandmasterB

1
@GrandmasterB - ฉันคิดว่า @Will กำลังถามคำถามผิด
ChrisF

1
@Will: ถ้าเป็นไปได้ให้ไปที่การประชุมกลุ่มผู้ใช้ Oracle หรือเทียบเท่าสำหรับฐานข้อมูลระดับสูงอื่น ๆ คุณจะพบว่าความคิดของคุณเกี่ยวกับ "เล็ก" และ "ใหญ่" นั้นจำเป็นต้องมีการปรับใหม่มากมาย มันเกิดขึ้นกับฉัน คำแนะนำ: ถ้ามันเหมาะกับดิสก์เดียวมันไม่ใหญ่ตามมาตรฐาน DBA
David Thornley

1
@Gorton, InnoDB โดยทั่วไปถือว่าดีกว่าสำหรับความน่าเชื่อถือและความสอดคล้องกัน MyISAM สำหรับความเร็ว ดังนั้นคุณต้องประเมินเอนจิ้นการจัดเก็บข้อมูลต่าง ๆ ตามการใช้ฐานข้อมูลของแอพพลิเคชั่นที่คุณต้องการ
GrandmasterB

5

ฟังดูเหมือนเป็นไอเดียที่ไม่ดี

อย่าพยายามที่จะเอาชนะฐานข้อมูลด้วยการสร้างที่แปลกใหม่เช่นนี้ เอ็นจิ้นฐานข้อมูลได้รับการออกแบบพร้อมการปรับแต่งมากมายเพื่อรองรับชุดข้อมูลขนาดใหญ่ ตัวอย่างเช่นสิ่งที่คุณกำลังอธิบายเสียงใกล้เคียงกับความพยายามในการใช้ดัชนีด้วยตนเอง เพียงใช้ดัชนีที่จัดทำโดย DB Engine พวกมันจะถูกนำไปใช้งานได้ดีกว่าที่คุณคาดว่าจะสามารถทำได้ด้วยตัวคุณเองและไม่จำเป็นต้องบำรุงรักษามากนัก

นอกจากนี้ยังเป็นกฎทั่วไปของหัวแม่มือ ฉันขอแนะนำไม่ให้สร้างฐานข้อมูลในลักษณะที่ต้องมีการจัดการหรือสร้างโครงสร้างฐานข้อมูล (ตารางเขตข้อมูล) ระหว่างการใช้งานแอปพลิเคชันตามปกติ มันทำให้การเพิ่มประสิทธิภาพสำหรับหมีและมักจะบังคับให้คุณให้สิทธิ์แก่ผู้ใช้มากเกินไปในการทำงานประจำที่อาจสร้างช่องโหว่ด้านความปลอดภัย


ฉันจะลงคะแนนหนึ่งครั้งสำหรับสองย่อหน้าของคุณถ้าอนุญาต
David Thornley

3

นี่คือบทความที่ฉันมักจะกระตุ้นให้คนอ่านเมื่อพวกเขาถามคำถามนี้:

http://datacharmer.blogspot.com/2009/03/normalization-and-smoking.html


ฉันไม่ทราบว่า DB สร้างไฟล์จริงต่อตาราง = x
จะ

1
สิ่งนี้อาจขึ้นอยู่กับ RDBMS จริงที่ใช้ MySQL ทำเช่นนั้น (มากถึงสามไฟล์ต่อตารางหากคุณใช้ MyISAM) คนอื่นอาจไม่
Mchl

รุ่น Enterprise ของ SQL Server จะทำถ้าคุณออกแบบอย่างนั้น แต่ไม่ได้โดยอัตโนมัติ
JeffO

Oracle ไม่ได้ทำอย่างนั้น
281377

Oracle สามารถทำได้เช่นเดียวกับที่ SQL Server สามารถทำได้ แต่ฉันไม่สามารถจินตนาการได้ว่าทำไมคุณถึงได้ออกแบบ schema ของคุณให้มีหนึ่งไฟล์ต่อตาราง การแยกฐานข้อมูลออกเป็นหลาย ๆ ไฟล์นั้นสมเหตุสมผล แต่ไม่ใช่หนึ่งไฟล์ต่อหนึ่งตาราง
Dean Harding

1

IMHO ตารางเดียวไม่ควรมีปัญหาดังนั้นอย่าสร้างปัญหาที่ไม่มีอยู่ - มีหลายสิ่งที่คุณสามารถทำได้เพื่อช่วยในการแสดง คุณสามารถแบ่งพาร์ติชันตารางเดียวเป็นหลาย ๆ ไฟล์ตาม clientID หรือฟิลด์ date เพื่อช่วยในการ IO db ของคุณไม่จำเป็นต้องติดตามเพิ่มประสิทธิภาพและแคชงบ SQL ที่แตกต่างกัน 20,000 คำสำหรับทุกข้อความค้นหาที่คุณต้องการ คุณสามารถสร้างดัชนีโดยรหัสลูกค้า ลูกค้า 20K สามารถชำระค่าฮาร์ดแวร์ได้จำนวนมาก

สำหรับตารางประเภทนี้สามารถใช้ NoSQL type db ได้

ด้วยไคลเอนต์ 20K ฐานข้อมูลอาจไม่ใช่จุดอ่อนที่สุดของคุณดังนั้นทำไมจึงแนะนำความซับซ้อนนี้มาก


`คุณสามารถแบ่งพาร์ติชันตารางเดียวเป็นหลายไฟล์ตาม clientID หรือฟิลด์ date เพื่อช่วยในการ IO '- ไม่แน่ใจว่าคุณหมายถึงอะไร ชี้แจงใด ๆ
จะ

หลายไฟล์ในระบบปฏิบัติการ เซิร์ฟเวอร์สามารถทำการอ่าน / เขียนไปยังไฟล์หลาย ๆ ไฟล์ได้มากกว่าหนึ่งไฟล์
JeffO

ฉันเดาว่าฉันหมายถึง: ฉันไม่เคยได้ยินเรื่องนี้มาก่อนฉันจะหาข้อมูลเพิ่มเติมเกี่ยวกับการทำสิ่งนี้ได้ที่ไหน? :-) แต่ฉันจะโจมตี google ~
จะ

msdn.microsoft.com/en-us/library/ms345146(v=sql.90).aspx คุณสามารถเรียกใช้ปัญหาประสิทธิภาพการสำรองข้อมูลได้หากดัชนีอยู่ในไฟล์แยกต่างหากจากตารางที่จัดทำดัชนี (หรืออาจเป็นไดรฟ์)
JeffO

0

นั่นเป็นวิธีที่ไม่ดีจริงๆ

แบ่งพาร์ติชันตารางในแนวตั้งเซิร์ฟเวอร์ฐานข้อมูล 2 เซิร์ฟเวอร์หนึ่งเซิร์ฟเวอร์สำหรับรหัสผู้ใช้แปลกและอีกเซิร์ฟเวอร์ควรทำงานได้ดี (ข้อมูลไม่เกี่ยวข้องกันระหว่างผู้ใช้)

จัดเรียงข้อมูลตาม user_id และหากเป็นไปไม่ได้จะได้รับดิสก์ RAM หรือ SSD จำนวนมาก

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