มีประโยชน์ใด ๆ ของคีย์หลักที่ประกอบด้วยคอลัมน์ทั้งหมดของตารางหรือไม่


17

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

เนื่องจากทุกคอลัมน์จะต้องทำการค้นหาการมีคีย์หลักมีประโยชน์กับฉันหรือไม่ (นอกจากบังคับให้มีการบันทึกที่ไม่ซ้ำกัน)?

คำตอบ:


12

ในกรณีของคุณฟิลด์เหล่านี้เป็นรหัสธรรมชาติ

รหัสตัวแทน:

กุญแจตัวแทนเป็นกุญแจที่ไม่มีความหมาย "ธุรกิจ" และใช้เพื่อระบุบันทึกในตารางเท่านั้น คีย์ดังกล่าวเป็นฐานข้อมูลที่สร้างขึ้น (ตัวอย่าง: Identity ใน SQL Server, Sequence ใน Oracle, Sequence / Identity ใน DB2 UDB เป็นต้น) หรือค่าที่ระบบสร้างขึ้น (เช่นสร้างผ่านตารางใน schema)

คีย์ธรรมชาติ:

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

คีย์ตัวแทนเทียบกับคีย์ธรรมชาติสำหรับคีย์หลัก

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


2
ฉันมักจะบอกคนอื่นว่าพวกเขาควรใช้กุญแจตัวแทนเว้นแต่พวกเขาต้องการรับประกันดัชนีแยกส่วนและประสิทธิภาพที่ไม่ดี มีข้อยกเว้นอยู่เสมอ แต่น้อยมากในกรณีนี้
AndrewSQL

7

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

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


1

คีย์คอมโพสิตเป็นคีย์หลักยังพบปัญหาเรื่องขนาดดัชนีที่อาจส่งผลต่อการใช้ดิสก์ความเร็ว io และการสำรองข้อมูล คุณอาจต้องการตรวจสอบโพสต์ของ Kimberly Tripp เกี่ยวกับคีย์หลักและดัชนีคลัสเตอร์ที่นี่: http://www.sqlskills.com/BLOGS/KIMBERLY/post/The-Clustered-Index-Debate-again!.aspx

ฉันก็จะแนะนำคีย์ตัวแทนในกรณีนี้แทนที่จะเป็นกุญแจธรรมดา


0

หากคุณมีตารางที่แสดงถึงความสัมพันธ์แบบหลายต่อกลุ่มซึ่งมีเพียง 2 คอลัมน์ดูเหมือนว่าสมเหตุสมผล

cf เลย คำถาม SO นี้

แต่ฉันยอมรับว่าฉันเพิ่มตัวแทนกุญแจแม้ในกรณีเหล่านั้น

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