ข้อ จำกัด ในฐานข้อมูลเชิงสัมพันธ์ - ทำไมไม่ลบอย่างสมบูรณ์?


20

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

เครื่องมือ ORM เช่น EntityContext, Linq2Data, NHibernate ยังจัดการกับข้อ จำกัด ด้วยตัวเองอย่างน้อยคุณก็รู้ว่าตารางใดที่ต้องการซึ่งกันและกัน การทำข้อ จำกัด ภายในเซิร์ฟเวอร์นั้นเกี่ยวกับการเปลี่ยนแปลง (บังคับ) เดียวกันสองครั้งหรือไม่?

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

เรื่องนี้ทำให้ฉันประหลาดใจและฉันไม่แน่ใจว่าจะจัดการกับมันอย่างไร

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

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


6
คุณวางแผนที่จะเข้าถึงข้อมูลผ่านเครื่องมือ ORM เดียวหรือไม่? หรือว่าคุณกำลังวางแผนที่จะ“ สนุก” จำลองข้อ จำกัด ทั้งหมดอย่างถูกต้องในแต่ละเครื่องมือ ORM ที่ใช้งานอยู่?
Donal Fellows

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

4
ผู้เยาว์ nitpick: ฉันคิดว่ามันน่าสับสนเล็กน้อยเมื่อคุณเรียกการเชื่อมต่อกุญแจต่างประเทศระหว่าง "ความสัมพันธ์" ของตาราง "ความสัมพันธ์" ในฐานข้อมูลเชิงสัมพันธ์เป็นตารางตัวเองไม่ใช่การเชื่อมต่อ โดยเฉพาะอย่างยิ่งเมื่อเราพูดถึง "การออกแบบเชิงสัมพันธ์" - นั่นหมายความว่าตารางหรือมันหมายถึงกุญแจต่างประเทศ?
โทมัส Padron-McCarthy

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

1
ฐานข้อมูลของคุณจะอยู่ได้นานกว่ารหัสแอปพลิเคชันของคุณ นอกจากนี้ ORM ของคุณกำลังส่งผลกระทบต่อประสิทธิภาพการทำงานของแอปพลิเคชันของคุณและมีโอกาสที่คุณจะจบลงด้วยความต้องการที่จะเลี่ยงผ่านอย่างน้อยในบางกรณีการใช้งาน หากคุณไม่รู้จักตอนนี้คุณจะรู้ได้ในที่สุด samsaffron.com/archive/2011/03/30/… . นอกจากนี้การลบข้อ จำกัด ทั้งหมดทำให้ฐานข้อมูลของคุณไม่สามารถปกป้องความสมบูรณ์ของตัวเองได้อย่างสมบูรณ์เมื่อมีการใช้งานแอพพลิเคชั่นอื่นที่ไม่ใช่ของคุณซึ่งอาจเป็นอะไรก็ได้จากแอปอื่น ๆ
Craig

คำตอบ:


46

สองเหตุผลทั่วไปที่จะไม่ลบข้อ จำกัด ออกจากฐานข้อมูล :

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

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


5
@ Jonas จากนั้นพูดคุยกับผู้ชายเกี่ยวกับปัญหาการรับรู้ด้วยการออกแบบฐานข้อมูลของเขา เชิงสัมพันธ์และเชิงวัตถุนั้นเป็นโลกทั้งสองที่แตกต่างกัน - ทั้งคู่ไม่ได้มี "การพัฒนา" เหนือสิ่งอื่นใดและทั้งคู่ก็มีที่ของตัวเอง การออกแบบแอพ C # บนหลักการเชิงสัมพันธ์นั้นเป็นความผิดพลาดครั้งใหญ่เช่นเดียวกับการออกแบบ DB the OO way
PéterTörök

3
@ Jonas, สะท้อนถึงการอัพเดทของคุณ: หากคุณจำเป็นต้องเขียนข้อความค้นหาที่ซับซ้อนมากเกินไปเพื่อให้ได้สิ่งที่ดูเหมือนง่ายๆกับ DB schema มันเป็นสัญญาณที่บ่งบอกว่าการออกแบบ DB นั้นไม่เพียงพอสำหรับจุดประสงค์ - หรือว่าคุณมีทักษะไม่เพียงพอ (โปรด ไม่ผิดไม่เห็นได้ชัดจากการโพสต์ของคุณว่าคุณมีประสบการณ์กับ SQL อย่างไรผมก็ยังห่างไกลจากการเป็นผู้เชี่ยวชาญ)
PéterTörök

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

8
"แอปพลิเคชั่นอื่น ๆ อาจเข้าถึงได้มากขึ้นทั้งในปัจจุบันและอนาคต" ไม่พูดถึงผู้ดูแลระบบฐานข้อมูลบางคนใช้คำสั่ง SQL ดิบเพื่อแก้ไขปัญหากับฐานข้อมูลในขณะที่ผู้ใช้กำลังรอ ...
โทมัส Padron-McCarthy

5
+1: หากฐานข้อมูลกำลังจัดเก็บข้อมูลทางธุรกิจ (ไม่ใช่เพียงแค่แอปกำหนดค่า ฯลฯ ) ความน่าจะเป็นที่ฐานข้อมูลจะแสดงสด / หรือขยายออกนอกแอพปัจจุบันกำลังเข้าใกล้ 100%
Binary Worrier

27

แอปพลิเคชันสามารถมาและไปได้ แต่มีข้อมูลอยู่ตลอดไป ใน บริษัท ของฉัน DB มีอายุมากกว่า 30-40 ปีจะอยู่ต่อไปตราบเท่าที่ บริษัท มีอยู่ แอปพลิเคชั่นเปลี่ยนแปลงผู้พัฒนามาและไป มันจะดีกว่าถ้ามี integrity และโมเดลข้อมูลเชิงตรรกะที่ดี ด้วยวิธีนี้ใครบางคนสามารถดูข้อมูลและรับความเข้าใจที่มีความหมายได้โดยไม่ต้องผ่านฐานข้อมูลที่ซับซ้อน นอกจากนี้ยังช่วยในการรายงานอย่างมีนัยสำคัญ แอปพลิเคชันสามารถและจะมีข้อบกพร่องและข้อ จำกัด ของฐานข้อมูลเป็นตัวป้องกัน ตำแหน่งเริ่มต้นของฉันคือมีข้อ จำกัด มาก (FK และตรวจสอบ) เท่าที่จะทำได้
เหตุผลเดียวที่จะไม่มีข้อ จำกัด คือถ้ารูปแบบการออกแบบของคุณไม่อนุญาตเช่นปัญหาตารางต่อลำดับชั้นหรือปัญหาประสิทธิภาพ


ฉันจะบอกว่าคุณทำคำแนะนำที่ฉลาดมากที่นี่ ความคิดเห็นของฉันอาจจะดีกว่าการพัฒนา RAD หรือการพัฒนาที่แอพพลิเคชั่นมีเวลาสั้น - เพื่อประโยชน์ในการบำรุงรักษาน้อยที่สุดในขณะที่กำลังพัฒนา
อิสระ

15

สิ่งที่รบกวนฉันคือข้อ จำกัด ทั้งหมดที่กำหนดค่าไว้ภายใน SQLserver ด้วย "not cascade"

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

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

โดยทั่วไปแล้วฐานข้อมูลจะถูกดำเนินการโดยหลาย ๆ แอปพลิเคชั่น = เว็บไซต์หรือแอพพลิเคชั่นบนเดสก์ท็อปแอปพลิเคชั่นรายงานเว็บเซอร์วิสหน้าต่างการสืบค้นกระบวนการ ETL เป็นต้นหากคุณไม่บังคับใช้ข้อ จำกัด ในระดับฐานข้อมูล ของข้อมูลที่เป็นหนึ่งในแอปพลิเคชันเหล่านั้นอาจไม่ปฏิบัติตามกฎทั้งหมด ประการที่สองคุณต้องเขียนโค้ดข้อห้ามเหล่านั้นหลายครั้งแล้วเขียนใหม่หากคุณตัดสินใจใช้แอปพลิเคชันอื่นในภายหลัง ประการที่สามคุณไม่สามารถควบคุมล่วงหน้าได้ว่าจะต้องดำเนินการบำรุงรักษาข้อมูลบางประเภทที่จะไม่เกิดขึ้นผ่านแอปพลิเคชันหรือไม่ (แก้ไขข้อมูลจากการนำเข้าข้อมูลลูกค้าที่ไม่ดีเช่นหรือเปลี่ยนแปลง 10,000,000 ระเบียนทั้งหมดจากไคลเอนต์หนึ่งราย ไปยังลูกค้ารายอื่นเมื่อ บริษัท คู่แข่งซื้อโดย) นักพัฒนาแอปพลิเคชันโดยทั่วไปจะไม่ '


ขอบคุณสำหรับการตอบ. กระบวนการและประเภทแอปพลิเคชันทั้งหมดที่คุณพูดถึงควรพูดคุยกับ DAL (ซึ่งจะมีข้อ จำกัด ) แต่! จุดของคุณสมบูรณ์แบบและความคิดเห็นของคุณดี Sidenote: ใช่ ฉันมักจะลองวิธีที่จะทำให้การพัฒนาง่ายขึ้น สำหรับฉันความซับซ้อนน้อยกว่าสามารถยืนหนทางที่จะทำผิดน้อย นี่ไม่ใช่ "ต้องการการพัฒนาที่ง่ายขึ้น / เร็วขึ้น" ถึงแม้ว่ามันจะเป็น - หากจัดการผิด ดังนั้นทำไมฉันโพสต์คำถามนี้! ฉันก็จะเห็นความรู้สึกที่ดีถ้ามีคนไม่ใช่น้ำตกนี้ถูกไล่ล่าด้วยความรู้สึกไม่ใช่ 100% เหมือนในสถานการณ์นี้ ฉันต้องหาเหตุผล
อิสระ

@ Jonas อาจมีเหตุผลด้านประสิทธิภาพด้วย ขึ้นอยู่กับจำนวนระเบียนลูก ตกลงถ้าคุณลบกลุ่มเล็ก ๆ แต่ถ้ามีล้านเรคคอร์ดอาจถูกทริกเกอร์คุณจะทำได้ดีกว่าในการทำแบทช์และไม่ล็อคตารางทั้งหมดในขณะที่กระบวนการทั้งหมดเกิดขึ้น โดยทั่วไปแล้ว dbas จำนวนมากจะไม่อนุญาตให้ลบแบบเรียงซ้อนด้วยเหตุผลนั้นเพราะมันสามารถล็อคระบบ prod ได้หากการลบส่งผลต่อเร็กคอร์ดจำนวนมากเกินไป
HLGEM

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

10

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

ฉันเชื่อมั่นว่านี่เป็นส่วนหนึ่งของการพัฒนาซอฟต์แวร์ที่คุณไม่ควรใช้ DRY (และฉันคาดหวังอย่างเต็มที่ว่า downvotes สำหรับคำสั่งนั้น) ข้อมูลของคุณคือหัวใจและจิตวิญญาณของแอปพลิเคชั่นของคุณ - ถ้ามันเสียหายเกินกว่าจะซ่อมได้นั่นคือ: จบเกม มันคุ้มค่าที่ IMO จะบังคับใช้ข้อ จำกัด ทุกที่ที่ต้องการ หากนั่นหมายถึงในรูปแบบของทริกเกอร์และข้อ จำกัด ในระดับฐานข้อมูลการตรวจสอบฝั่งเซิร์ฟเวอร์ในมิดเดิลแวร์และจาวาสคริปต์ฝั่งไคลเอ็นต์บน UI (สำหรับเว็บแอป) แสดงว่า IMO เป็นสิ่งที่ไม่จำเป็นเพื่อให้แน่ใจว่าข้อมูลนั้นบริสุทธิ์เสมอ .


6

คุณรู้หรือไม่ว่า ORM หมายถึงอะไร? การทำแผนที่วัตถุสัมพันธ์ การอ้างอิง Wikipedia "เทคนิคการแปลงข้อมูลระหว่างระบบประเภทที่เข้ากันไม่ได้ " ใช่โมเดลเชิงสัมพันธ์และโมเดลวัตถุไม่สอดคล้องกัน ORMs ทำการแปลงที่ค่อนข้างดีโดยเคารพกฎของระบบทั้งสองชนิด RDBMS ถูกจัดระเบียบในลักษณะเช่นนี้เพื่อให้คุณได้รับข้อมูลที่สมบูรณ์โดยใช้ข้อ จำกัด โดยทั่วไปความสมบูรณ์เป็นสิ่งที่ดีมากดังนั้น ORM จึงมักใช้เมื่อสร้างแบบจำลองข้อมูลสำหรับจัดเก็บข้อมูลวัตถุ ORM ของคุณอาจมีเหตุผลที่ดีที่จะใช้ข้อ จำกัด "ที่ไม่ใช่ทั้งหมด" และหากสิ่งนี้บังคับให้คุณทำการสืบค้นที่ซับซ้อนแทนเพียงแค่สร้าง / อัปเดต / วางวัตถุบางอย่างแล้วมีบางอย่างผิดปกติกับการตั้งค่า ORM ของคุณ

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


หัวข้อนี้เกี่ยวกับการย้ายฟังก์ชันการทำงานของข้อ จำกัด ออกจากฐานข้อมูลและพึ่งพาการตั้งค่า / การพัฒนาภายในรหัสฐาน (เช่น. net ที่พูด: Entity / Linq2Sql)
อิสระ

ใช่ฉันรู้ แต่ประเด็นของฉันคือคุณต้องเข้าใจก่อนว่าเหตุใดจึงมีข้อ จำกัด ตั้งแต่แรกและทำไมจึงเป็นความคิดที่ดีที่จะทิ้งมันไว้
Jacek Prucia

ย้าย! ไม่ตกหล่น ฉันเข้าใจว่าคุณเสียใจในความรู้เรื่องการเกิดปฏิกิริยาซึ่งไม่เกี่ยวกับ
อิสระ

คุณไม่สามารถย้ายอะไรระหว่างระบบที่เข้ากันไม่ได้ คุณกำลังจะวางข้อ จำกัด ของ DB แนะนำข้อ จำกัด ของแอปพลิเคชันและเพียงหวังว่าพวกเขาจะทำงานเหมือนกัน (ซึ่งอาจกลายเป็นจริงและเท็จ) ถ้าฉันเข้าใจผิดคำถามของคุณ
Jacek Prucia

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

6

นั่นคือสิ่งที่ eBay ทำและพวกเขาอาจมีหนึ่งในฐานข้อมูลที่ใหญ่ที่สุดในโลก:

http://www.dba-oracle.com/oracle_news/news_ebay_massive_oracle.htm http://www.addsimplicity.com/downloads/eBaySDForum2006-11-29.pdf

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

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

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


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

10
ใช่และอย่าลืม - อย่าลืม - อีเบย์เช่น Facebook และ Amazon - มีขนาดใหญ่กว่า 99.99% ของฐานข้อมูลเป็นพันล้านครั้งและสิ่งที่ดีสำหรับพวกเขานั้นอาจแตกต่างจากฐานข้อมูลของคุณ
Tony Andrews

2
และอีเบย์, Facebook, Amazon อาจไม่ใช้ฐานข้อมูลโดยไม่มีข้อ จำกัด สำหรับซอฟต์แวร์ทางการเงินและบัญชีหรือซอฟต์แวร์สินค้าคงคลังหรือข้อมูลทรัพยากรบุคคลหรือที่ใดก็ตามที่ไม่ทำให้ข้อมูลสูญหายเป็นสิ่งสำคัญ
HLGEM

2
หากคุณมีเวลาความเชี่ยวชาญและเงินเพียงพอคุณก็สามารถเขียนโปรแกรม RDBMS เว็บเซิร์ฟเวอร์หรือระบบปฏิบัติการใดก็ได้เพื่อให้เหมาะกับความต้องการเฉพาะ
JeffO

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

4

ครั้งแรก - คำตอบของฉัน: ไม่คุณไม่ควรพึ่งพาแอปพลิเคชันเพียงอย่างเดียวเพื่อดูแลข้อมูลของคุณ

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

กระบวนทัศน์ใหม่กำลังเกิดขึ้นอีกครั้งใช้การเขียนโปรแกรมฟังก์ชั่นเช่น หากทีม dev ตัดสินใจที่จะยอมรับวิธีการเขียนโปรแกรมแบบใหม่สิ่งนี้จะมีผลอะไรกับข้อมูลที่ได้รับการจัดโครงสร้างตามข้อกำหนดของ ORM?

ฉันเห็นด้วยกับ @Jacek Prucia - ฉันคิดว่า ORM เป็นการจับคู่ที่ไม่ดีสำหรับ RDBMS ฉันจะเลือก DBAL บน RDBMS เป็นการส่วนตัวหรือไป OODB กับ ORM


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

3

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

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

เมื่อพัฒนาให้ใช้งานง่าย ข้อ จำกัด ให้คุณทำอย่างนั้น (ที่กล่าวว่าเมื่อข้อ จำกัด เกิดข้อผิดพลาดอย่าคายข้อผิดพลาดเดิมกลับมาที่ผู้ใช้ทำให้เกิดข้อผิดพลาดที่เข้าใจได้)

(สำหรับปัญหาเกี่ยวกับน้ำตก: นั่นเป็นสิ่งที่ดีฉันต้องการที่จะโยนข้อผิดพลาดที่บันทึกอื่น ๆ บางอย่างต้องถูกลบออกก่อนแทนที่จะพึ่งพาน้ำตกเพื่อให้ได้ทุกอย่างถูกต้อง Cascades นั้นดีในทางทฤษฎี ดังนั้นในทางปฏิบัติ)


2

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

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

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

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

กรณีหนึ่งที่ใช้งานได้คือแอพพลิเคชั่นระดับองค์กรขนาดใหญ่อย่าง PeopleSoft และ SAP ซึ่งแอปพลิเคชันนั้นทำทุกอย่างได้จริงและมีวิธีกำหนดไว้อย่างละเอียดเพื่อขยาย มีความเป็นไปได้อื่น ๆ ที่หายากมาก

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


1
ขอบคุณสำหรับการตอบ. ข้อ จำกัด จะอยู่ในฐานข้อมูลสำหรับโครงการนี้! ฉันมั่นใจอย่างสมบูรณ์ :) ฉันจะมีตาที่กว้างขึ้นเมื่อตัดสินใจสิ่งนี้ในโครงการในอนาคตและพูดคุยกับส่วนอื่น ๆ
อิสระ

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