ฉันไม่เห็นคำตอบที่ชี้ให้เห็น (สิ่งที่ฉันถือว่าเป็น) ประเด็นพื้นฐานที่แท้จริงนั่นคือคีย์หลักคือสิ่งที่รับประกันว่าคุณจะไม่ได้รับสองรายการในตารางสำหรับเอนทิตีในโลกแห่งความเป็นจริงเดียวกัน (เช่น จำลองในฐานข้อมูล) ข้อสังเกตนี้ช่วยระบุว่าอะไรดีและอะไรคือตัวเลือกที่ไม่ดีสำหรับคีย์หลัก
ตัวอย่างเช่นในตารางชื่อและรหัสสถานะ (US) ชื่อหรือรหัสอาจเป็นคีย์หลัก - ประกอบด้วยคีย์ตัวเลือกสองคีย์ที่แตกต่างกันและหนึ่งในนั้น (โดยปกติจะเป็นรหัสที่สั้นกว่า) จะถูกเลือกเป็น คีย์หลัก ในทฤษฎีการพึ่งพาการทำงาน (และเข้าร่วมการอ้างอิง - 1NF ถึง 5NF - เป็นคีย์ตัวเลือกที่มีความสำคัญมากกว่าคีย์หลัก
สำหรับตัวอย่างที่โต้แย้งโดยทั่วไปชื่อของมนุษย์มักเป็นตัวเลือกที่ไม่ถูกต้องสำหรับคีย์หลัก มีหลายคนที่ใช้ชื่อ "John Smith" หรือชื่ออื่นที่คล้ายกัน แม้จะคำนึงถึงชื่อกลาง (จำไว้ว่าไม่ใช่ทุกคนที่มีชื่อเดียวเช่นฉันไม่มี) มีขอบเขตมากมายสำหรับการทำซ้ำ ดังนั้นผู้คนจึงไม่ใช้ชื่อเป็นคีย์หลัก พวกเขาประดิษฐ์กุญแจเทียมเช่นหมายเลขประกันสังคม (SSN) หรือหมายเลขพนักงานและใช้เพื่อกำหนดตัวบุคคล
คีย์หลักในอุดมคติคือสั้นไม่ซ้ำใครน่าจดจำและเป็นธรรมชาติ ในลักษณะเหล่านี้จำเป็นต้องมีความเป็นเอกลักษณ์ ส่วนที่เหลือต้องยืดหยุ่นตามข้อ จำกัด ของข้อมูลในโลกแห่งความเป็นจริง
เมื่อพูดถึงการกำหนดคีย์หลักของตารางที่กำหนดดังนั้นคุณต้องดูว่าตารางนั้นหมายถึงอะไร ชุดหรือชุดของค่าคอลัมน์ใดในตารางที่ระบุแต่ละแถวในตารางโดยไม่ซ้ำกัน สิ่งเหล่านี้คือกุญแจผู้สมัคร ตอนนี้หากคีย์ตัวเลือกแต่ละตัวประกอบด้วย 4 หรือ 5 คอลัมน์คุณอาจตัดสินใจว่าคีย์เหล่านั้นงุ่มง่ามเกินไปที่จะสร้างคีย์หลักที่ดี (โดยหลักจากความสั้นเป็นหลัก) ในกรณีดังกล่าวคุณอาจแนะนำรหัสตัวแทนซึ่งเป็นหมายเลขที่สร้างขึ้นเอง บ่อยมาก (แต่ไม่เสมอไป) จำนวนเต็ม 32 บิตแบบธรรมดาก็เพียงพอแล้วสำหรับคีย์ตัวแทน จากนั้นคุณกำหนดรหัสตัวแทนนี้เป็นคีย์หลัก
อย่างไรก็ตามคุณต้องตรวจสอบให้แน่ใจว่าคีย์ตัวเลือกอื่น ๆ (สำหรับคีย์ตัวแทนเป็นคีย์ตัวเลือกเช่นกันเช่นเดียวกับคีย์หลักที่เลือก) ทั้งหมดยังคงเป็นตัวระบุที่ไม่ซ้ำกันโดยปกติโดยการวางข้อ จำกัด ที่ไม่ซ้ำกันในชุดคอลัมน์เหล่านั้น
บางครั้งผู้คนพบว่ายากที่จะระบุสิ่งที่ทำให้แถวไม่ซ้ำกัน แต่ควรมีบางอย่างที่ต้องทำเพราะเพียงแค่การทำข้อมูลซ้ำ ๆ ไม่ได้ทำให้เป็นจริงอีกต่อไป และหากคุณไม่ระวังและได้รับสองแถว (หรือมากกว่า) ที่อ้างว่าจัดเก็บข้อมูลเดียวกันจากนั้นคุณต้องอัปเดตข้อมูลมีอันตราย (โดยเฉพาะอย่างยิ่งถ้าคุณใช้เคอร์เซอร์) ที่คุณจะอัปเดตเพียงแถวเดียว แทนที่จะเป็นทุกแถวดังนั้นแถวจึงไม่ตรงกันและไม่มีใครรู้ว่าแถวใดมีข้อมูลที่ถูกต้อง
นี่เป็นมุมมองที่ค่อนข้างยากในบางประเด็น
ฉันไม่มีปัญหากับการใช้ GUID เมื่อจำเป็น แต่มักจะมีขนาดใหญ่ (เช่น 16-64 ไบต์) และมักใช้บ่อยเกินไป บ่อยครั้งที่ค่า 4 ไบต์ที่ดีอย่างสมบูรณ์แบบก็เพียงพอแล้ว การใช้ GUID ซึ่งค่า 4 ไบต์จะเพียงพอทำให้สิ้นเปลืองเนื้อที่ดิสก์และทำให้การเข้าถึงข้อมูลที่จัดทำดัชนีช้าลงเนื่องจากมีค่าน้อยกว่าต่อหน้าดัชนีดังนั้นดัชนีจะมีความลึกและต้องอ่านหน้ามากขึ้นเพื่อไปที่ ข้อมูล.