การบังคับใช้ความถูกต้องของฐานข้อมูล


19

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

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

คำตอบ:


24

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

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

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

หากคุณใช้ระบบฐานข้อมูลเชิงสัมพันธ์ฉันว่าทำไมคุณไม่ใช้มัน หากคุณไม่ต้องการข้อมูลเชิงสัมพันธ์ไปกับ Hadoop หรืออย่างอื่น


2
นั่นเป็นสิ่งที่ฉันคิดและคาดหวังมาก ฉันรู้ว่า DBA ที่งานก่อนหน้าของฉันผิดเกี่ยวกับเรื่องนี้แค่อยากได้ความเห็นแบบอิสระเกี่ยวกับเรื่องนี้ ขอบคุณ!
Renats Stozkovs

17

นักพัฒนาแอปพลิเคชันจำนวนมากคิดอย่างนั้น

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

อัตราต่อรองคืออะไร?


5
+1 นั่นเป็นพื้นมัน คุณแทนที่ระบบที่ผ่านการทดสอบเป็นอย่างดีและเป็นศูนย์กลางด้วยโปรแกรมเมอร์จำนวนมากที่ต้องปฏิบัติตาม ทุกเวลา. จะไม่เกิดขึ้น - คุณจะได้รับฐานข้อมูลที่มีข้อมูลไม่ดีตลอดเวลา
TomTom

13

แม้ว่าจะมีประสิทธิภาพเพิ่มขึ้นก็ตาม แต่ก็ไม่สามารถเปรียบเทียบได้กับการกลับมาของ Referential Integrity และความสมบูรณ์ของข้อมูลทั่วไป

อีกต่อไปนานเป็นวันที่ฐานข้อมูลเป็นแหล่งข้อมูลใบ้ ใช้ประโยชน์จากพลังที่ RDBMS เสนอให้

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


-1 นานมาแล้วคือวันที่ผู้คนใส่ตรรกะการประยุกต์ใช้ลงในฐานข้อมูลที่ยากที่สุดและ msot มีราคาแพงในการขยายส่วนของสแต็กทั้งหมด - สำหรับฉันฐานข้อมูลเป็นที่เก็บการถ่ายโอนข้อมูลที่มีตรรกะดำเนินการโดยแอปพลิเคชัน That SAID: Referential Integrity เป็นเรื่องเกี่ยวกับ integrity ระดับฐานข้อมูลและมีประโยชน์มาก
TomTom

5
@TomTom การเขียนซ้ำตรรกะความสมบูรณ์ของข้อมูลในแอปพลิเคชันของคุณกำลังทำซ้ำงานที่ทำไปแล้วใน RDBMS เก็บข้อมูลตรรกะไว้ในฐานข้อมูล
Thomas Stringer

@TomTom - "ข้อมูลที่ไม่ถูกต้องตามทฤษฎี shuold ไม่เคยโจมตีฐานข้อมูล แต่ integrity เป็นบรรทัดสุดท้ายของการป้องกัน" ตกลง แบบฟอร์ม AJAX แฟนซีที่จะช่วยให้ผู้ใช้ปลายทางของคุณปวดหัวมากโดยการตรวจสอบการป้อนข้อมูลของพวกเขาล่วงหน้า ในทำนองเดียวกันผู้ที่ จำกัด ฐานข้อมูลจะช่วยให้ธุรกิจและวิศวกรของคุณเพียงเท่าในเวลาเงินและพลังงานหายไปทำความสะอาดขึ้นหลังจากรหัสที่ไม่ดี
Nick Chammas

6

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

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


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

3

มีสองสามครั้งเมื่อมีข้อ จำกัด เข้ามา:

  1. เมื่อคุณต้องการใช้Single Table Inheritance (STI) ลองนึกภาพคุณขายให้ทั้งบุคคลและองค์กร คุณจะต้องมีตาราง "ปาร์ตี้" เดี่ยวซึ่งมีแถวเป็นรายบุคคลหรือ org STI หมายความว่าคุณต้องมีฟิลด์ที่สามารถ nullable ได้ซึ่งไม่ควรเป็น null Class Table Inheritance แก้ปัญหานี้ แต่มันยากสำหรับ ORM บางตัว Rubi ActiveRecord รองรับเฉพาะ STI เท่านั้น

  2. เมื่อคุณต้องการสนับสนุนเอนทิตีเวอร์ชันแบบร่างนั่นอาจไม่ถูกต้องสมบูรณ์ คุณสามารถจัดเก็บร่างเป็น json ได้ แต่จากนั้นยากที่จะใช้ตัวระบุเดียวกันซ้ำอีกครั้งบนไคลเอนต์ - จินตนาการว่ามันถูกบันทึกด้วย id = 5, แก้ไขให้ไม่ถูกต้องและบันทึกอัตโนมัติเป็น draftid = 99 ในกรณีนี้ทุกสาขาของคุณอาจจะต้องเป็นโมฆะ

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