เหตุใดจึงมีข้อ จำกัด ในฐานข้อมูลมากกว่าใช้รหัส


21

เหตุใดจึงมีข้อ จำกัด ในฐานข้อมูล มันจะไม่ยืดหยุ่นกว่าที่จะใส่ไว้ในรหัสหรือไม่

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

 entity type    |   sub-types
----------------+--------------------------------------------
   Person       |   Employee, Student,       ...
   Student      |   Graduate, Undergraduate, ...
   Employee     |   Teacher,  Administrator, ...

ข้อ จำกัด ในปัจจุบัน:

  1. ผู้ที่ลงทะเบียนในระบบสามารถเป็นนักเรียนหรือพนักงานเท่านั้น
  2. บุคคลนิติบุคคลต้องมีหมายเลขสังคมที่ไม่ซ้ำกันซึ่งเราสันนิษฐานว่าทุกคนมีเพียงหนึ่งเดียวที่ไม่ซ้ำกัน (aka, คีย์หลักที่ดีพอ ) (ดู # 1)

ต่อมาเราตัดสินใจที่จะลบหมายเลข 1: หากวันหนึ่งวิทยาลัยตัดสินใจว่าTeacher( Employeeประเภทย่อย) สามารถทำได้เช่นStudentกันการเรียนในเวลาว่างของพวกเขามันยากมากที่จะเปลี่ยนการออกแบบฐานข้อมูลซึ่งอาจมีหลายพันล้านล้าน zillions ของรายการมากกว่าแค่การเปลี่ยนลอจิกในโค้ด: ส่วนที่ไม่อนุญาตให้บุคคลที่ลงทะเบียนทั้งในฐานะนักเรียนและพนักงาน

(มันไม่น่าจะเป็นไปได้มาก แต่ฉันไม่สามารถนึกถึงสิ่งอื่นได้ในตอนนี้ เห็นได้ชัดว่าเป็นไปได้)

ทำไมเราใส่ใจกฎธุรกิจในการออกแบบฐานข้อมูลมากกว่าในรหัส?

# 1: บันทึกย่อ 7 ปีต่อมาตัวอย่างชีวิตจริง:
ฉันเคยเห็นรัฐบาลที่มีข้อผิดพลาด SSNs ที่เผยแพร่ซ้ำซ้อน: หลายคน SSN เดียวกัน ผู้ที่ออกแบบฐานข้อมูลต้นฉบับนั้นทำผิดพลาดอย่างแน่นอนว่าจะไม่ใช้ข้อ จำกัด ที่ไม่ซ้ำกันนี้ในฐานข้อมูล (และในภายหลังมีข้อบกพร่องในแอปพลิเคชันดั้งเดิม - หลายแอปพลิเคชันโดยใช้ฐานข้อมูลที่ใช้ร่วมกันและไม่ยอมรับที่จะวางตรวจสอบและบังคับใช้ข้อ จำกัด ? ... )
ข้อผิดพลาดนี้จะยังคงมีอยู่ในระบบและระบบทั้งหมดที่พัฒนาขึ้นหลังจากนั้นใช้ฐานข้อมูลของระบบดั้งเดิมนั้นเป็นเวลาหลายปี การอ่านคำตอบที่นี่ฉันเรียนรู้ที่จะใช้ข้อ จำกัด ทั้งหมดให้มากที่สุดเท่าที่จะเป็นไปได้อย่างชาญฉลาด (ไม่ใช่คนตาบอด) ในฐานข้อมูลเพื่อเป็นตัวแทนของโลกทางกายภาพที่แท้จริงออกมาให้ดีที่สุดเท่าที่จะทำได้


2
ส่วนใหญ่เราใส่ใจเกี่ยวกับกฎทางธุรกิจที่มีการบังคับใช้และเป็นวิธีที่ดีที่สุดสำหรับสิ่งนั้น
ypercubeᵀᴹ

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

3
จริงๆแล้วในฐานะนักศึกษาปริญญาโทฉันถือว่าทั้งนักเรียนพนักงานและอาจารย์ ตัวอย่างของคุณจึงไม่น่าจะเป็นไปได้
Winston Ewert

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

วัตถุ <-> การทำแผนที่เชิงสัมพันธ์เป็นศิลปะ
Thorbjørn Ravn Andersen

คำตอบ:


34

ข้อ จำกัด บางอย่างบังคับใช้ดีที่สุดในฐานข้อมูลและบางข้อบังคับใช้ดีที่สุดในแอปพลิเคชัน

ข้อ จำกัด ที่มีการบังคับใช้ที่ดีที่สุดในฐานข้อมูลมักจะมีเพราะพวกเขามีพื้นฐานโครงสร้างของรูปแบบข้อมูลเช่น contraint category_idต่างประเทศที่สำคัญเพื่อให้มั่นใจว่าผลิตภัณฑ์ที่มีความถูกต้อง

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

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

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


ดังนั้นตามคำตอบนี้กฎ <a person สามารถมีได้เฉพาะในตารางย่อยของนักเรียนหรือเฉพาะในตารางย่อยของพนักงานเท่านั้น> ควรใช้ในรหัสและฐานข้อมูลมี <ประเภทย่อยนักเรียน / พนักงานจะต้องถูกต้อง คน> ข้อ จำกัด ฉันถูกไหม? (มันเป็นตัวอย่างของหนังสือ) ขอบคุณ
hkoosha

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

2
@loolooyyyy: อีกวิธีหนึ่งในการใช้แบบจำลองข้อมูลดั้งเดิมและยังคงให้ครูเป็นนักเรียนอาจจะมีตารางอื่นที่เรียกว่าteachers_as_studentsซึ่งเป็นชนิดย่อยอื่นStudentsและมีคีย์ต่างประเทศใหม่ที่อ้างถึงTeachersและคีย์หลักที่สร้างขึ้นแทนระบบโซเชียล หมายเลขความปลอดภัย ด้วยวิธีนี้ "นักเรียน" จริง ๆ แล้วเป็นนามแฝงสำหรับครูดังนั้นครูยังสามารถลงทะเบียนเพื่อเข้าเรียน เป็นการยากที่จะบอกว่าสิ่งนี้จะทำงานได้ดีเพียงใดโดยไม่เห็นรูปแบบข้อมูลทั้งหมด
FrustratedWithFormsDesigner

2
ฉันลงคะแนนสิ่งนี้ ไม่มีเวลาที่จะบังคับใช้ข้อ จำกัด ที่ดีที่สุดในแอปพลิเคชันเท่านั้น น้ำเสียงของคำตอบนี้มีน้ำหนักไม่เหมาะสม
Evan Carroll

3
@FrustratedWithFormsDesigner จริงๆแล้วมันเป็นเด็กหลักสำหรับข้อ จำกัด ของรหัสต่างประเทศ สมมติว่าคุณมีลูกค้าสามรายที่มีเวอร์ชัน / บิลด์ต่างกันของจุดเชื่อมต่อ db คุณจะทำอย่างไรเมื่อคุณหยุดจัดส่งผลิตภัณฑ์นั้นด้วยสีแดง คุณจะเก็บรายการการผสมสีที่เป็นไปได้ไว้ที่ไหน คำแนะนำ: ฉันมีสถานที่รวมศูนย์สำหรับคุณ และถ้าคุณสร้างตารางcolor_productsและcolorคุณอาจจะสามารถสร้าง drop down เพิ่มเติมได้อย่างง่ายดายยิ่งขึ้น - ตัวโหลด IDEs / schema ส่วนใหญ่รองรับ fkeys ต่อไปนี้
Evan Carroll

35

เพราะ:

  1. ฉันต้องการให้ข้อมูลทั้งหมดในฐานข้อมูลอยู่ภายใต้ข้อ จำกัด เดียวกันไม่ใช่เฉพาะข้อมูลใหม่ที่ต้องอยู่ภายใต้ข้อ จำกัด ในรหัสของรุ่นที่ทำงานอยู่ในปัจจุบัน
  2. ฉันต้องการข้อ จำกัด ในการประกาศไม่ใช่ข้อ จำกัด เชิงโปรแกรม
  3. ข้อมูลในฐานข้อมูลมักจะอยู่เหนือรหัสที่เขียนเพื่อโต้ตอบกับมันในวันนี้ และข้อมูลนั้นไม่ใช่รหัส - เป็นสินทรัพย์ขององค์กร
  4. รหัสของฉันจะง่ายขึ้นมากเมื่อฉันรู้ว่าข้อมูลทั้งหมดอยู่ภายใต้ข้อ จำกัด ที่เข้มงวด ฉันไม่ต้องพิจารณากรณีพิเศษอีกต่อไปซึ่งฉันรู้ว่าฐานข้อมูลรับประกันว่าจะเป็นไปไม่ได้

ด้วยเหตุผลบางอย่างที่สำคัญสำหรับฉัน


4
กึ่งที่เกี่ยวข้องกับ (1) และ (3): ข้อบกพร่องในรหัสแอปพลิเคชันสามารถแก้ไขได้ข้อบกพร่องในข้อมูลของคุณมักจะไม่สามารถแก้ไขได้
mu สั้นเกินไป

17

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

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


17

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

โดยทั่วไปข้อ จำกัด ระดับแอปพลิเคชันจะพ่ายแพ้แม้ว่าฐานข้อมูลจะอ่านกลไกความสอดคล้องซึ่งเซสชันไม่สามารถดูข้อมูลของเซสชันอื่นจนกว่าจะมีการยืนยัน

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

ไม่เป็นที่รู้จักสำหรับนักออกแบบภาษาแอปพลิเคชัน แต่อย่างใด อ่านหัวข้อ3.10 ที่ไม่ซ้ำกันในคู่มือRuby on Rails: การตรวจสอบความถูกต้องของบันทึกและการเรียกกลับ

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


16

ประโยชน์ของข้อ จำกัด ที่บังคับใช้โดยฐานข้อมูล:

ความเรียบง่าย - การประกาศข้อ จำกัด นั้นง่ายกว่าการประกาศข้อ จำกัด และการเขียนรหัสที่จะบังคับใช้การประกาศนั้น

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

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

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

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

Longevity - แพลตฟอร์มฐานข้อมูลของคุณจะมีอายุการใช้งานที่ยาวนานกว่า


11

เหตุใดจึงมีข้อ จำกัด ในเซิร์ฟเวอร์ เพราะคุณไม่สามารถบังคับให้คนเลวใช้ลูกค้าของคุณ

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

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


10

บางคำตอบที่ดีที่นี่และมีความเสี่ยงในการทำซ้ำความคิดอื่น ๆ :

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

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


9
  1. ฐานข้อมูลสามารถตรวจสอบข้อ จำกัด ได้อย่างมีประสิทธิภาพ ดีกว่ารหัส

  2. ข้อ จำกัด ของความซื่อสัตย์ช่วยฐานข้อมูลเพื่อค้นหาแผนการดำเนินการที่มีประสิทธิภาพ

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


8

คำตอบสั้น ๆ ... เพื่อรักษาความถูกต้องของข้อมูล (เช่นความถูกต้องและความถูกต้อง)

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

สำหรับทุกอย่างอื่น ...
ฐานข้อมูลมักจะรับใช้เจ้านายสองซึ่งผมจะเรียกบรรณาธิการและผู้ใช้

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

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

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

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

อย่างไรก็ตามเท่าที่เราแกล้งเราสามารถทำนายอนาคตเราไม่สามารถ

ความพยายามในการสร้างฐานข้อมูลใด ๆ มีค่าเกินกว่าที่จะทิ้งมันไป เหมือนบ้านฐานข้อมูลจะถูกขยายเปลี่ยนแปลงและปรับปรุงหลายครั้ง แม้ว่าจะถูกแทนที่อย่างสมบูรณ์ข้อมูลทั้งหมดจะถูกย้ายไปยังฐานข้อมูลใหม่ในขณะที่รักษากฎและความสัมพันธ์ทางธุรกิจเก่าทั้งหมดไว้

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

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


7

นอกจากความคิดเห็นอื่น ๆ ...

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


5

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

ทริกเกอร์มีโอกาสน้อยที่จะพกพาได้เนื่องจากมักจะเขียนด้วยภาษาเฉพาะของผู้ขายเช่น PL / SQL

แต่ถ้าข้อ จำกัด ไม่ตรงกับความต้องการของคุณคุณสามารถใช้ทริกเกอร์เพื่อบังคับใช้กฎทางธุรกิจของคุณ


5
ทริกเกอร์ยังไม่รับประกันความสมบูรณ์เนื่องจากปัญหาการอ่านที่สอดคล้องกัน
David Aldridge

3

ควรนำไปใช้กับฐานข้อมูลก่อนเสมอเพราะ

  1. ฐานข้อมูลสร้างความมั่นใจในความสมบูรณ์ของไคลเอนต์ที่แตกต่างกัน คุณสามารถมีไคลเอนต์ที่แตกต่างกันบนแพลตฟอร์มต่าง ๆ เข้าถึงฐานข้อมูล ข้อ จำกัด ในฐานข้อมูลไม่เสี่ยงต่อปัญหาความถูกต้องเมื่อคุณสร้างลูกค้าใหม่ สิ่งนี้จะช่วยให้คุณประหยัดจากข้อ จำกัด ของคุณในกรณีที่มีการเขียนซ้ำหรือจุดเชื่อมต่อเพิ่มเติม
  2. ฐานข้อมูลมี DSL สำหรับการสร้างข้อ จำกัด : SQL DDL!
  3. ฐานข้อมูลจัดเตรียมการเข้าถึงข้อ จำกัด เหล่านั้นในแค็ตตาล็อกระบบดังนั้น ORM ที่เหมาะสมหรือ"ตัวโหลดสคีมา"สามารถอ่านข้อ จำกัด เหล่านั้นและนำมาไว้ในแอปพลิเคชันของคุณ ตัวอย่างเช่นหากฐานข้อมูลของคุณระบุว่าคุณมีvarchar(5)ประเภทมีโอกาสที่ดีที่คุณจะสามารถค้นหา schema ที่กำลังโหลด ORM สำหรับภาษาเฉพาะของคุณที่แมปประเภทภาษากับประเภทของสคีมา DBIx for Perl is one such schema loader; นี่เป็นอีกหนึ่งสำหรับEntity Framework ความสามารถของรถตักเหล่านี้แตกต่างกันไป แต่สิ่งที่พวกเขาสามารถให้ได้คือการเริ่มต้นที่ดีเพื่อให้แน่ใจในความสมบูรณ์ของแอพโดยไม่ต้องเดินทางไปที่ฐานข้อมูล
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.