มันไม่ใช่แนวปฏิบัติที่ดีในการออกแบบที่ไม่จำเป็น นั่นคือไม่ใช่วิธีปฏิบัติที่ดีที่จะมีคีย์หลักเพิ่มขึ้นอัตโนมัติโดยอัตโนมัติเมื่อไม่ต้องการใช้
ลองดูตัวอย่างที่ไม่จำเป็นต้องใช้
คุณมีตารางสำหรับบทความนี้มีคีย์หลัก int id
และคอลัมน์ varchar title
ที่ชื่อว่า
นอกจากนี้คุณยังมีตารางเต็มรูปแบบของบทความหมวดid
คีย์หลัก int, name
varchar
แถวหนึ่งในตารางบทความมีid
จำนวน 5 ส่วนและtitle
"วิธีปรุงห่านด้วยเนย" คุณต้องการเชื่อมโยงบทความนั้นกับแถวต่อไปนี้ในตารางหมวดหมู่ของคุณ: "Fowl" ( id : 20), "Goose" ( id : 12), "Cooking" ( id : 2), "Butter" (id: 9) .
ตอนนี้คุณมี 2 ตาราง: บทความและหมวดหมู่ คุณสร้างความสัมพันธ์ระหว่างสองคนได้อย่างไร
คุณสามารถมีตารางที่มี 3 คอลัมน์: id (คีย์หลัก), article_id (คีย์ต่างประเทศ), category_id (คีย์ต่างประเทศ) แต่ตอนนี้คุณมีสิ่งที่ชอบ:
| id | a_id | c_id |
| 1 | 5 | 20 |
| 2 | 5 | 12 |
| 3 | 5 | 2 |
ทางออกที่ดีกว่าคือการมีคีย์หลักที่ประกอบด้วย 2 คอลัมน์
| a_id | c_id |
| 5 | 20 |
| 5 | 12 |
| 5 | 2 |
สิ่งนี้สามารถทำได้โดยการทำ:
create table articles_categories (
article_id bigint,
category_id bigint,
primary key (article_id, category_id)
) engine=InnoDB;
อีกเหตุผลที่ไม่ใช้จำนวนเต็มเพิ่มอัตโนมัติคือถ้าคุณใช้ UUID สำหรับคีย์หลักของคุณ
UUID นั้นมีความหมายที่ไม่ซ้ำกันซึ่งทำสิ่งเดียวกันกับที่ใช้จำนวนเต็มเฉพาะ พวกเขายังมีสิทธิประโยชน์เพิ่มเติม (และข้อเสีย) ของตนเองมากกว่าจำนวนเต็ม ตัวอย่างเช่นด้วย UUID คุณจะรู้ว่าสตริงที่ไม่ซ้ำกันที่คุณอ้างถึงจุดไปยังระเบียนข้อมูลเฉพาะ สิ่งนี้มีประโยชน์ในกรณีที่คุณไม่มีฐานข้อมูลกลาง 1 หรือที่แอปพลิเคชันมีความสามารถในการสร้างบันทึกข้อมูลออฟไลน์ (จากนั้นอัปโหลดไปยังฐานข้อมูลในภายหลัง)
ในท้ายที่สุดคุณไม่จำเป็นต้องคิดถึงกุญแจหลักเป็นอย่างอื่น คุณต้องคิดว่ามันเป็นหน้าที่ของพวกเขา ทำไมคุณต้องมีคีย์หลัก เพื่อให้สามารถระบุชุดข้อมูลเฉพาะจากตารางโดยใช้เขตข้อมูลที่จะไม่เปลี่ยนแปลงในอนาคต คุณต้องการคอลัมน์ใดคอลัมน์หนึ่งที่เรียกว่าid
ทำสิ่งนี้หรือคุณสามารถใช้ฐานข้อมูลระบุตัวตนที่ไม่ซ้ำกันนี้จากข้อมูลอื่น ๆ ที่ไม่เปลี่ยนรูปแบบได้หรือไม่?