อาร์คพิเศษในฐานข้อมูลคืออะไรและทำไมมันถึงชั่วร้าย?


10

ฉันอ่านข้อผิดพลาดในการออกแบบฐานข้อมูลที่พบบ่อยที่สุดโดยนักพัฒนาถามและตอบเกี่ยวกับ stackoverflow ที่คำตอบแรกมีวลีเกี่ยวกับส่วนโค้งพิเศษ:

อาร์คเอกสิทธิ์เป็นข้อผิดพลาดทั่วไปที่โต๊ะถูกสร้างขึ้นโดยมีกุญแจต่างประเทศตั้งแต่สองปุ่มขึ้นไปโดยที่หนึ่งและหนึ่งในนั้นเท่านั้นที่สามารถไม่ใช่ค่าว่างได้ ความผิดพลาดครั้งใหญ่. สำหรับสิ่งหนึ่งมันกลายเป็นเรื่องยากที่จะรักษาความสมบูรณ์ของข้อมูล ท้ายที่สุดแม้จะมี Referential Integrity แต่ก็ไม่มีอะไรที่ป้องกันไม่ให้มีการตั้งค่าคีย์ต่างประเทศเหล่านี้ตั้งแต่สองตัวขึ้นไป (ข้อ จำกัด การตรวจสอบที่ซับซ้อนแม้จะมี)

ฉันไม่เข้าใจจริงๆว่าเพราะเหตุใดอาร์คเอ็กซ์คลูซีฟจึงชั่วร้าย อาจเป็นเพราะฉันไม่เข้าใจพื้นฐานของมัน มีคำอธิบายที่ดีเกี่ยวกับส่วนโค้งพิเศษหรือไม่?

คำตอบ:


8

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

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


4
ตำแหน่งรถบรรทุกที่เป็นไปได้สามแห่งคือ subclasses ของ superclass "ตำแหน่งรถบรรทุก" มีหลายกรณีที่คลาสย่อยนั้นไม่สามารถเกิดขึ้นพร้อมกันได้ ความท้าทายกลายเป็นวิธีจำลองคลาสและคลาสย่อยในตารางเชิงสัมพันธ์
วอลเตอร์ Mitty

ฉันยอมรับว่ามีบางกรณีที่การใช้การออกแบบนี้เป็นธรรม อย่างไรก็ตามฉันสามารถเห็นด้วยกับโพสต์ต้นฉบับว่ารูปแบบนี้ใช้มากเกินกว่าที่ควรจะเป็น มันมีข้อเสียที่ยิ่งใหญ่เช่นกัน ...
JDT

6
ไม่สามารถใช้ข้อ จำกัด ในการตรวจสอบได้? alter table mytable add constraint myconstraint check ((col1 is not null and col2 is null and col3 is null) or (col1 is null and col2 is not null and col3 is null) or (col1 is null and col2 is null and col3 is not null))เช่น ฉันไม่ชอบส่วนโค้งพิเศษ แต่สามารถบังคับใช้กับข้อ จำกัด การตรวจสอบได้ แน่นอนว่าต้องมีข้อ จำกัด ของ FK ด้วย
Tulains Córdova

1
ดังนั้น "ข้อ จำกัด การตรวจสอบที่ซับซ้อนแม้จะมี" จากโพสต์ที่ยกมาข้างต้น คุณอาจสามารถทำการตรวจสอบที่ซับซ้อนกับข้อ จำกัด การตรวจสอบหรือ heck แม้กระทั่งตัวเรียกใช้ซึ่งไม่ได้ทำให้เป็นความคิดที่ดีหรือเป็นสัญลักษณ์ของการออกแบบที่ดี ลองนึกภาพการทำข้อ จำกัด ตรวจสอบในโค้งพิเศษกับสี่หรือห้าคอลัมน์ ... นอกจากนี้ผมค่อนข้างแน่ใจว่าไม่ทุกเครื่องมือฐานข้อมูลสนับสนุนการแสดง CHECK จำกัด MySQL ระบุไว้อย่างชัดเจนในเอกสารที่ CHECK ส่วนจะแยกวิเคราะห์ แต่ไม่สนใจ ...
JDT

แหล่งข้อมูลนี้แนะนำส่วนโค้งพิเศษ คิด?
Alex Moore-Niemi

4

ไม่มีอะไรชั่วร้ายเกี่ยวกับส่วนโค้งพิเศษ เพียงแค่บังคับใช้กฎทางธุรกิจที่เกี่ยวข้องโดยใช้ข้อ จำกัด การตรวจสอบ ระบบการจัดการฐานข้อมูลส่วนใหญ่สนับสนุนข้อ จำกัด การตรวจสอบ (Oracle, SQL Server, PostgreSQL) หากคุณกำลังใช้เครื่องมือสร้างแบบจำลองข้อมูลมีโอกาสที่เครื่องมือของคุณจะสร้างรหัสโดยอัตโนมัติเพื่อใช้ข้อ จำกัด การตรวจสอบ


-1

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

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