เหตุใดจึงต้องมีการระบุคีย์


15

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


คุณหมายถึงว่าถ้าคุณมีคีย์ UNIQUE ทำไมคุณถึงต้องมีคีย์หลัก?
Vérace

1
ทำไมพวกเขาถึงได้ประกาศเลย? ดูเหมือนว่ามีประโยชน์มาก แต่จริง ๆ แล้วจำเป็นต้องมีฐานข้อมูลที่ทำงานได้หรือไม่
dsaxton

1
พวกเขาไม่ต้องการให้ฐานข้อมูลของคุณทำงาน แต่จำเป็นสำหรับข้อมูลของคุณที่จะ "ทำงาน" นั่นคือความสอดคล้องเพราะนั่นคือวิธีที่คุณบอกเซิร์ฟเวอร์ฐานข้อมูลของคุณเพื่อให้ข้อมูลสอดคล้องกัน
Andriy M

หากฐานข้อมูลรู้ว่าเขตข้อมูลที่กำหนดเป็นคีย์ผลข้างเคียงคือมันสามารถช่วยคุณค้นหาแถวที่มีคีย์ได้เร็วกว่ามากหากต้องการค้นหาแถวทั้งหมดในตาราง ดัชนีเป็นส่วนสำคัญมากที่ทำให้ฐานข้อมูลมีประโยชน์
Thorbjørn Ravn Andersen

คำตอบ:


32

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

มีสาเหตุหลายประการที่ทำให้สิ่งนี้เป็นแนวคิดที่ไม่ดี (ไม่ดีไม่ดี ... )

1) หากคุณกำลังสร้างเอ็นจิ้น "ข้อ จำกัด " ของตัวเอง "(เช่นภายในรหัสแอปพลิเคชันของคุณ) จากนั้นคุณจะจำลองสิ่งที่ Oracle / SQL Server / MySQL / PostgreSQL / <ใครก็ตาม ... > ได้ใช้ไปปีเขียน รหัส CONSTRAINT ของพวกเขาได้รับการทดสอบในช่วงหลายปีที่ผ่านมาโดยผู้ใช้งานหลายล้านคน

2) ด้วยความเคารพอย่างสูงต่อคุณและทีมของคุณคุณจะไม่ถูกต้องแม้แต่ในเวลาไม่กี่ปี - จากที่นี่รหัส MySQL เพียงอย่างเดียวมีค่าใช้จ่าย 40 ล้านดอลลาร์ และ MySQL นั้นเป็นเซิร์ฟเวอร์ที่ถูกที่สุดในบรรดา 3 เซิร์ฟเวอร์ด้านบนและพวกเขาไม่ได้ใช้การตรวจสอบข้อ จำกัด เห็นได้ชัดว่าการได้รับ RI (Referential Integrity) อย่างถูกต้องนั้นเป็นเรื่องยาก

ฉันเคยฟอรัม Oracle บ่อยครั้งและฉันไม่สามารถบอกคุณได้ว่าผู้จัดการ / โปรแกรมเมอร์ที่ยากจนบางคนมีโครงการผลักดันเขาซึ่งอัจฉริยะที่เคยทำงานของเขามาก่อนมีแนวคิด "สดใส" ในการทำสิ่งที่คุณแนะนำ .

Jonathan Lewis (เขาเขียนหนังสือหน้า 550 บนพื้นฐานของเครื่องมือเพิ่มประสิทธิภาพ Oracle ) ให้เป็นไม่ 2 จากภัยพิบัติการออกแบบของเขาในหนังสือเล่มอื่น (" Tales of the Oak Table " - The Oak Table เป็นกลุ่มของผู้เชี่ยวชาญ Oracle)

  1. เราจะตรวจสอบความถูกต้องของข้อมูลในระดับแอปพลิเคชันแทนที่จะใช้ประโยชน์จากความสามารถในการตรวจสอบข้อ จำกัด ของ Oracle

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

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

หากต้องการตอบคำถามของคุณโดยเฉพาะ:

ทำไมพวกเขาถึงได้ประกาศเลย? ดูเหมือนว่ามีประโยชน์มาก แต่จริง ๆ แล้วจำเป็นต้องมีฐานข้อมูลที่ใช้งานได้

เหตุผลว่าKEYs (อย่างใดอย่างหนึ่งPRIMARY, FOREIGN, UNIQUEหรือเพียงแค่สามัญINDEXe) มีการประกาศก็คือว่าในขณะที่มันไม่เคร่งครัดจำเป็นสำหรับฐานข้อมูลที่มีพวกเขามันทำงานมันเป็นอย่างที่จำเป็นสำหรับพวกเขาที่จะได้รับการประกาศให้มันฟังก์ชั่นเดียว


1
ขอบคุณสำหรับคำตอบ. ฉันอาจต้องเรียนรู้เพิ่มเติมเพื่อทำความเข้าใจ (จริง ๆ แล้วฉันไม่ได้เป็นสมาชิกของทีมฉันแค่เรียนรู้เกี่ยวกับฐานข้อมูลจากความอยากรู้อยากเห็น)
dsaxton

2
อ่านหนังสือสองสามเล่ม (เดทการ์เซีย - โมลินา ... ) และกลับมาหาเราหากคุณมีคำถามเฉพาะ (คำถามที่กว้างเกินไปถือว่าเป็นหัวข้อที่นี่) ps ยินดีต้อนรับสู่ฟอรัม :-)
Vérace

ในขณะที่ฉันจะไม่เคยแสดงให้เห็นว่าคุณใส่ไม่มีข้อ จำกัด ในฐานข้อมูล (คุณควรมีคีย์หลักและคีย์ต่างประเทศที่ต่ำสุดเปลือย) คุณสามารถหลีกเลี่ยง # 3 โดยมีปพลิเคชันทั้งหมดบริโภคจากบริการที่ใช้ร่วมกัน (Service Oriented Architecture ) (นั่นอาจเป็นสิ่งที่คุณควรพิจารณาสำหรับผู้บริโภคหลายคนอย่างไรก็ตามเนื่องจากการตรวจสอบความสมบูรณ์ครั้งล่าสุดทุกครั้งที่คุณต้องการในฐานข้อมูลสามารถทำให้ฝันร้ายได้เช่นกันลองนึกถึงการกระตุ้นการตรวจสอบทุกที่ในตารางและแถวตลอดเวลา)
jpmc26

10

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

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

8

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

คีย์หลักมีแนวโน้มที่จะเป็นแนวคิดที่มีประโยชน์โดยเฉพาะอย่างยิ่งในทางปฏิบัติ

ไม่ว่าคุณจะบังคับใช้คีย์หรือไม่ (คุณควร) เอกสารมีค่าในสิทธิของตนเอง


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

1
@reinierpost ฉันเห็นด้วยอย่างเต็มที่ ข้อมูลเป็นวัตถุที่มีค่าที่สุดในการจัดทำเอกสารและรักษาความสะอาดให้คงอยู่ตลอดไป รหัสสามารถเปลี่ยน; มันมีแนวโน้มที่จะเป็นชั่วคราว
boot4life

@reinierpost - ให้คำปรึกษากับ บริษัท ที่จัดหาซอฟต์แวร์สำหรับโครงสร้างพื้นฐานทางรถไฟทั้งหมดของประเทศยุโรปขนาดใหญ่ (ใหญ่ - คิดว่าเป็นพันล้านวิดเจ็ต) และฉันพูดว่า "ครวญครางฉันจะเรียกใช้แบบสอบถามเพื่อตรวจสอบFOREIGN KEYคำจำกัดความเพื่อรับ รู้สึกถึงระบบ ". แบบสอบถามของฉันส่งคืนรหัสไปรษณีย์ !!! แน่ใจว่า SQL ของฉันต้องผิดฉันพูดถึงสิ่งนี้กับหนึ่งในโปรแกรมเมอร์อาวุโส ด้วยความภาคภูมิใจ (ไม่น้อยกว่า) เขาประกาศ (ราวกับว่าเขากำลังนำเสนอลูกชายที่เกิดใหม่) ว่าระบบไม่มี FK ใด ๆ เพราะ "การค้นหาทั้งหมดอยู่ในPRIMARY KEYs" - (ไม่เกี่ยวข้อง) <Doh ... > a la Homer Simpson!
Vérace

5

อีกเหตุผลที่คุณควรใช้ CONSTRAINT แทนการใช้รหัสแอพพลิเคชั่น:

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

PS: แน่นอนว่าคุณสามารถสร้างทริกเกอร์ได้ แต่โดยปกติจะช้ามาก (เมื่อเทียบกับข้อ จำกัด )

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