โครงสร้างฐานข้อมูล SQL สำหรับ RESTful API


11

ฉันกำลังสร้าง RESTful API ฉันกำลังดิ้นรนที่จะตัดสินใจเกี่ยวกับวิธีที่ดีที่สุดในการออกแบบตารางฐานข้อมูลรอบทรัพยากรของฉัน

ตอนแรกฉันแม้ว่าตารางต่อทรัพยากรจะเป็นวิธีที่ดี แต่ตอนนี้ฉันกังวลว่าสิ่งนี้จะส่งผลให้ตารางมีขนาดใหญ่ขึ้นอย่างทวีคูณยิ่งทำให้ห่วงโซ่ทรัพยากรมากขึ้น

ตัวอย่างเช่นสมมติว่าฉันมีทรัพยากรสามอย่างคือผู้ใช้ลูกค้ายอดขาย ผู้ใช้เป็นสมาชิกของ api ของฉันลูกค้าคือลูกค้าผู้ใช้และยอดขายเป็นการซื้อโดยลูกค้าแต่ละรายไปยังบัญชีผู้ใช้

เข้าถึงทรัพยากรการขายดังนี้

GET /users/{userID}/clients/{clientID}/sales/{salesID}

ดังนั้นหากมีผู้ใช้ 10 คนแต่ละคนมีลูกค้า 10 คนและสำหรับลูกค้าแต่ละรายมียอดขาย 10 รายการขนาดของตารางจะใหญ่ขึ้นเรื่อย ๆ ตามห่วงโซ่ทรัพยากรที่เราไป

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

นอกจากนี้ยังจำเป็นต้องเข้าร่วมตารางก่อนเรียกใช้แบบสอบถาม เหตุผลก็คือฉันอนุญาตให้ผู้ใช้แต่ละคนมีชื่อลูกค้าเหมือนกัน เพื่อหลีกเลี่ยงการรับข้อมูลไคลเอนต์ที่ไม่ถูกต้องตารางผู้ใช้และตารางไคลเอ็นต์จะถูกรวมโดย {userID} นี่เป็นกรณีขาย การเข้าร่วมตารางขนาดใหญ่และการอ่านและเขียนจะทำให้ช้าลงหรือไม่

คำตอบ:


31

ฉันกำลังดิ้นรนที่จะตัดสินใจเกี่ยวกับวิธีที่ดีที่สุดในการออกแบบตารางฐานข้อมูลรอบทรัพยากรของฉัน

อย่า

ออกแบบ API ของคุณตามเจ้าRESTfulออกแบบฐานข้อมูลของคุณตามหลักการปรับสภาพ หนึ่งไม่จำเป็นต้องส่งผลกระทบต่ออีก

ฐานข้อมูลของคุณไม่ควรมีSaleResourceตารางมันควรมีตารางSale(หรือซื้อ / สั่งซื้อ) ตารางนั้นจะมีคีย์หลักที่ระบุการขายและกุญแจต่างประเทศที่ไม่ซ้ำกับผู้ใช้และตารางลูกค้าที่เกี่ยวข้อง

คุณ REST api จะแปลคำขอทรัพยากรที่ระบุโดยGET /users/{userID}/clients/{clientID}/sales/{salesID}การสืบค้นฐานข้อมูลที่เหมาะสมดึงแถวสร้างทรัพยากรที่แสดงถึงการขายและส่งคืนไปยังลูกค้า

โปรดทราบว่าขณะนี้คุณกำลังเปิดเผยสิ่งที่ดูเหมือนจะเป็นตัวระบุฐานข้อมูลภายใน (UserID / ClientId / SalesID) สู่โลกภายนอก มันอาจจะเหมาะสมในกรณีของคุณ แต่โดยทั่วไปแล้ว<entity>IDรู้สึกได้ใน RESTful API


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

3
ใช่. ไม่มีสิ่งใดที่คุณกล่าวถึงบ่งชี้ว่าการเบี่ยงเบนจากสคีมาที่เป็นมาตรฐานนั้นมีความจำเป็น
Mark Storey-Smith

9

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

ในฐานะที่เป็นหมายเหตุด้านข้าง: คุณไม่จำเป็นต้องใช้user/{userID}ใน URI คุณรู้จักผู้เช่า (userID) จากข้อมูลการตรวจสอบสิทธิ์


ขอบคุณ - ใช่ฉันต้องอ่านเพิ่มเติม โครงการของฉันจนถึงปัจจุบันมีงานฐานข้อมูลน้อยมาก ฉันจะอ่านทรัพยากรที่คุณแนะนำ
Gaz_Edge

ฉันคิดว่าการแบ่งปันแบบแชร์เป็นวิธีที่จะทำให้ฉัน 'ผู้ใช้' ของฉันไม่ใช่ 'ผู้เช่า' พวกเขาไม่ต้องการข้อมูลที่แยกได้และจะไม่ต้องเข้าถึงฟังก์ชั่นการจัดการฐานข้อมูลโดยตรง จากสิ่งที่ฉันอ่านสิ่งนี้จะเป็นการแนะนำให้แชร์แบบแชร์ดีที่สุด? คุณคิดอย่างไร?
Gaz_Edge

2
การแบ่งปันเป็นวิธีที่ง่ายที่สุด คุณต้องเพิ่มuser_idเป็นกุญแจสำคัญในทุกตารางและเพิ่มleft.user_id = right.user_idการเชื่อมโยงที่เกี่ยวข้อง (โดยปกติคือทั้งหมด) ORMบางตัวรองรับการหยุดการเข้าถึง และอย่าหลงกลผู้ใช้ของคุณเป็นผู้เช่าเนื่องจากคุณไม่ต้องการให้ผู้ใช้ 'foo' ดู / แก้ไขยอดขายของผู้ใช้ 'บาร์'
Remus Rusanu

ขอบคุณ ฉันเริ่มเห็นว่าดัชนีเป็นกุญแจสำคัญในการสร้างโครงสร้างฐานข้อมูลของฉัน
Gaz_Edge

0

เพียงเพิ่มสิ่งที่พูดไปแล้ว - คุณอาจต้องการสร้างส่วนต่อประสานระหว่าง API จริงกับเลเยอร์ฐานข้อมูลของคุณ มันทำให้การเพิ่มแคชและตารางสรุปง่ายกว่าในบรรทัด ...


1
ลิงก์หรือคำอธิบายเพิ่มเติมจะมีประโยชน์
Gaz_Edge

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