ฐานข้อมูลผู้เช่าหลายรายมีฐานข้อมูลหลายแห่งหรือตารางที่แชร์หรือไม่


24

เป็นฐานข้อมูลผู้เช่าหลายคน:

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

ตัวอย่างเช่นภายใต้ตัวเลือก # 1 ด้านบนฉันอาจมีเซิร์ฟเวอร์ MySQL ที่พูดmydb01.example.comและอาจมีcustomer1ฐานข้อมูลอยู่ภายใน customer1ฐานข้อมูลนี้อาจมี 10 ตารางที่เพิ่มประสิทธิภาพแอปพลิเคชันของฉันสำหรับลูกค้ารายนั้น (ลูกค้า # 1) มันอาจจะมีcustomer2ฐานข้อมูลที่มี 10 ตารางเหมือนกัน แต่มีเพียงข้อมูลสำหรับลูกค้า # 2 มันอาจมีcustomer3ฐานcustomer4ข้อมูลฐานข้อมูลและอื่น ๆ

ในตัวเลือก # 2 ด้านบนจะมีเพียงฐานข้อมูล / สคีเดียวเท่านั้นพูดmyapp_dbอีกครั้งโดยมี 10 ตารางอยู่ (เหมือนที่อยู่ด้านบน) แต่ที่นี่ข้อมูลสำหรับลูกค้าทั้งหมดอยู่ใน 10 ตารางเหล่านั้นและพวกเขาจึง "แบ่งปัน" ตาราง และที่ชั้นแอปพลิเคชันการควบคุมตรรกะและความปลอดภัยซึ่งลูกค้าสามารถเข้าถึงได้ว่าระเบียนใดบ้างใน 10 ตารางดังกล่าวและมีการดูแลอย่างดีเยี่ยมเพื่อให้แน่ใจว่าลูกค้า # 1 ไม่เคยลงชื่อเข้าใช้แอปและดูข้อมูลของลูกค้า # 3 เป็นต้น

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


"ผู้เช่าหลายคน" หมายถึงความปลอดภัยที่แข็งแกร่ง - นำไปใช้ที่ไหนสักแห่ง - เพื่อให้ผู้เช่ารายหนึ่งไม่สามารถมองเห็นข้อมูลของผู้อื่นไม่สามารถแก้ไขได้ไม่สามารถปฏิเสธการเข้าถึงเป็นต้นไม่สามารถใช้การรักษาความปลอดภัยนั้นได้ ตัวเลือก # 1 และ # 2 ของ OP ทำงานได้ทั้งคู่ แต่การวิเคราะห์ความปลอดภัยและงานที่ต้องใช้ในการรักษาความปลอดภัยนั้นแตกต่างกัน สำหรับสิ่งที่คุ้มค่าฉันทำงานที่การเริ่มต้นที่ใช้หลายการเช่าผ่านทางเลือก # 2 ที่ตารางซึ่งมีแถวที่เป็นของผู้เช่าหลายคนถูกซ่อน (ผ่านการอนุญาต) จากผู้ใช้ปลายทางทั้งหมดและการรักษาความปลอดภัย
davidbak


1
หากสิ่งนี้จบลงด้วยการถูกปิดซ้ำฉันคิดว่าเราควรตั้งค่าสถานะเพื่อรวมเข้ากับเป้าหมายล่อเพราะทั้งสองคำถามมีคำตอบที่ดีจริงๆ

คำตอบ:


29

ซึ่งกระบวนทัศน์เหล่านี้ถือเป็น DB "ผู้เช่าหลายคน" แบบดั้งเดิม

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

แน่นอนแอปพลิเคชันต้องการแนวคิดฐานข้อมูลที่อนุญาตให้แยกข้อมูลของผู้เช่าที่แตกต่างกันและแนวคิดของการเช่าหลาย ๆ ครั้งคือการแบ่งปันทรัพยากรเซิร์ฟเวอร์บางอย่าง (อย่างน้อยฮาร์ดแวร์) สำหรับการใช้ทรัพยากรที่ดีขึ้นและการจัดการที่ง่ายขึ้น ดังนั้น "multi tenant DB" คือสิ่งที่สนับสนุนสิ่งนี้โดยตรงโดยที่ส่วนของโมเดล db หรือตารางถูกแบ่งใช้

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


ขอบคุณ @Doc บราวน์ (+1) แต่แล้วได้อย่างไรที่คุณอาจจะมีใด ๆของฐานข้อมูลที่เป็นไม่ได้หลายลูก?!?
smeeb

4
@smeeb: multi-tenancy เป็นคุณสมบัติของแอปพลิเคชันที่ใช้โดยผู้เช่ารายอื่นไม่ใช่ของฐานข้อมูล "behind" แอปพลิเคชัน แน่นอนว่าแนวคิด db จำเป็นต้องสนับสนุนการเช่าหลายครั้งเพื่อให้เป็นไปได้
Doc Brown

4
@smeeb: สมมติว่าคุณมีตารางผู้ใช้ที่มีข้อ จำกัด ว่าชื่อผู้ใช้นั้นไม่ซ้ำกันตอนนี้พนักงานของผู้เช่าบางคนไม่สามารถใช้ชื่อผู้ใช้ได้อีกต่อไปเพียงเพราะคนอื่นที่ทำงานกับผู้เช่ารายอื่นกำลังใช้งานอยู่
RemcoGerlich

5
@smeeb: หากวิธีเดียวในการให้บริการผู้เช่าสองรายคือการติดตั้งและเรียกใช้แอปพลิเคชันสองครั้งบนเซิร์ฟเวอร์ที่แตกต่างกันสองแห่งโดยมีฐานข้อมูลแยกกันสองแห่งฉันคิดว่าจะไม่เรียกผู้เช่าหลายรายนี้
Doc Brown

1
ฉันไปที่งานนำเสนอบน Azure สักครู่หนึ่งซึ่งบอกว่า MYOB ใช้งานโซลูชันคลาวด์บน Azure และผู้เช่าแต่ละคนจะได้รับ DB ของตัวเอง (และเว็บเซิร์ฟเวอร์ด้วย) พวกเขามีเครื่องมืออัตโนมัติที่ยอดเยี่ยมในการจัดการอินสแตนซ์ DB หลายร้อยตัวที่ต้องมี ในทางกลับกันองค์กรที่ฉันทำงานเพื่อรันลูกค้าหลายร้อยรายจากฐานข้อมูลเดียวมันมีงานที่ทำในซอฟต์แวร์เพื่อบังคับใช้การแยกข้อมูลของลูกค้า นอกจากนี้เรายังพิจารณาไฮบริดซึ่งลูกค้ารายใหญ่ที่สุดของเราจะได้รับฐานข้อมูลของตนเองในขณะที่ลูกค้ารายอื่นแบ่งปันต้นฉบับ
David Keaveny

36

ตามที่ Microsoft คำว่ามีความหมายที่อาจเกิดขึ้น 3 (ฐานข้อมูลหนึ่งสำหรับผู้เช่าทั้งหมดหรือหนึ่ง databaser ต่อผู้เช่า)

ในการใช้ตัวอย่างของคุณลูกค้าแต่ละรายจะเป็นผู้เช่าของตัวเอง

  1. ฐานข้อมูลต่อผู้เช่า (ลูกค้า)

    • ผู้เช่าแต่ละรายแยกจากผู้อื่น (ไม่มีการเข้าถึงข้อมูลของผู้เช่ารายอื่นโดยไม่ได้ตั้งใจ)
    • การแยกยังช่วยให้ง่ายต่อการจัดการการกู้คืนข้อมูลเช่นเดียวกับความต้องการจัดเก็บข้อมูลที่เหมาะสมกับความต้องการของผู้เช่า
  2. ฐานข้อมูลที่ใช้ร่วมกันแยกสคีมา

    • ผู้เช่าแต่ละรายมีสคีมาของตนเองและข้อมูลของพวกเขาอยู่ในตารางของตัวเอง
    • การกู้คืนอาจใช้เวลานานขึ้นเนื่องจากทุกคนอยู่ในฐานข้อมูลเดียวกันคุณไม่สามารถกู้คืนฐานข้อมูลเป็นการสำรองข้อมูลก่อนหน้าได้ (มันจะย้อนกลับข้อมูลของผู้เช่าทุกคน) ตัวเลือกคือการกู้คืนไปยังฐานข้อมูลใหม่แล้วผสาน / คัดลอกข้อมูลของผู้เช่า 1 รายเท่านั้น
  3. ฐานข้อมูลที่ใช้ร่วมกันคีมาที่ใช้ร่วมกัน

    • ข้อมูลผู้เช่าทุกคนอยู่ในตารางเดียวกัน หากคุณติดตามคำสั่งซื้อตัวอย่างคำสั่งซื้อของผู้เช่าทุกรายจะอยู่ใน "dbo.Orders"
    • ข้อมูลของผู้เช่าถูกคั่นด้วยคอลัมน์ในแต่ละตาราง (อาจเป็น TenantId) ซึ่งแสดงเจ้าของแถว

มีข้อดีข้อเสียสำหรับแต่ละคำอธิบายในบทความนี้: https://msdn.microsoft.com/en-us/library/aa479086.aspx

โบนัส: คุณสามารถคิดว่ามันเป็นที่พักอาศัย (เรียบง่ายอย่างไม่มีการลด)

  1. ผู้เช่าทุกคนมีบ้านของตัวเอง พวกเขาสามารถทำอะไรก็ได้ที่พวกเขาต้องการและถ้ามันเผาไหม้มันจะไม่ส่งผลกระทบต่อคนอื่น

  2. ผู้เช่าทุกคนอยู่ในอาคารเดียวกัน แต่มีอพาร์ตเมนต์ของตัวเอง

  3. ทุกคนอาศัยอยู่ในอพาร์ทเมนต์เดียวกันและทุกสิ่งถูกทำเครื่องหมายด้วยโน้ตเพื่อแสดงว่าใครเป็นเจ้าของ


2
ขอบคุณสำหรับคำตอบ. คุณช่วยอธิบายรายละเอียดเล็กน้อยได้ไหม นั่นจะสร้างคำตอบที่ดีกว่า
Thomas Junk

1
ตัวอย่างโบนัสของคุณยอดเยี่ยม @ imms90
Aravin

3
Microsoft ได้ละทิ้งหน้าที่คุณเชื่อมโยงจาก MSDN เครื่อง Waybackยังคงมีสำเนา
Mike Catrill 'Cat Recall'

1
บทความที่คล้ายกันจาก MS (อาจเหมือนเดิมที่มีการย้าย): docs.microsoft.com/en-us/azure/sql-database/…
Pierre Henry
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.