ฉันกำลังสร้างตารางฐานข้อมูลและฉันไม่ได้รับคีย์หลักแบบลอจิคัล ดังนั้นฉันจึงคิดที่จะทิ้งมันไว้โดยไม่มีกุญแจหลัก แต่ฉันก็รู้สึกผิดเล็กน้อย ฉันควร?
แต่ละตารางควรมีคีย์หลักหรือไม่
ฉันกำลังสร้างตารางฐานข้อมูลและฉันไม่ได้รับคีย์หลักแบบลอจิคัล ดังนั้นฉันจึงคิดที่จะทิ้งมันไว้โดยไม่มีกุญแจหลัก แต่ฉันก็รู้สึกผิดเล็กน้อย ฉันควร?
แต่ละตารางควรมีคีย์หลักหรือไม่
คำตอบ:
คำตอบสั้น: ใช่
คำตอบยาว:
ใน MySQL เครื่องมือจัดเก็บข้อมูล InnoDB จะสร้างคีย์หลักเสมอหากคุณไม่ได้ระบุไว้อย่างชัดเจนจึงสร้างคอลัมน์เพิ่มเติมที่คุณไม่สามารถเข้าถึงได้
โปรดทราบว่าคีย์หลักสามารถคอมโพสิต
หากคุณมีตารางลิงค์หลายต่อหลายคุณสร้างคีย์หลักในทุกสาขาที่เกี่ยวข้องในลิงค์ ดังนั้นคุณจึงมั่นใจได้ว่าคุณไม่มีสองหรือมากกว่าระเบียนที่อธิบายหนึ่งลิงก์
นอกเหนือจากปัญหาความสอดคล้องเชิงตรรกะเอ็นจิ้น RDBMS ส่วนใหญ่จะได้รับประโยชน์จากการรวมฟิลด์เหล่านี้ไว้ในดัชนีที่ไม่ซ้ำกัน
และเนื่องจากคีย์หลักใด ๆ เกี่ยวข้องกับการสร้างดัชนีที่ไม่ซ้ำกันคุณควรประกาศและรับทั้งความสอดคล้องเชิงตรรกะและประสิทธิภาพ
ดูบทความนี้ในบล็อกของฉันสำหรับเหตุผลที่คุณควรสร้างดัชนีที่ไม่ซ้ำกับข้อมูลที่ไม่ซ้ำกัน:
ป.ล.มีบางกรณีที่พิเศษมากซึ่งคุณไม่ต้องการคีย์หลัก
ส่วนใหญ่จะรวมตารางบันทึกที่ไม่มีดัชนีใด ๆด้วยเหตุผลด้านประสิทธิภาพ
ดีที่สุดเสมอที่จะมีคีย์หลัก วิธีนี้เป็นไปตามรูปแบบปกติแรกและช่วยให้คุณดำเนินการต่อไปตามเส้นทางการปรับฐานข้อมูล
ตามที่ระบุไว้โดยผู้อื่นมีเหตุผลบางอย่างที่จะไม่มีคีย์หลัก แต่ส่วนใหญ่จะไม่ได้รับอันตรายหากมีคีย์หลัก
ค่อนข้างทุกครั้งที่ฉันสร้างตารางโดยไม่มีคีย์หลักคิดว่าฉันไม่ต้องการใช้ฉันจบลงด้วยการกลับไปเพิ่มอีกหนึ่ง ตอนนี้ฉันสร้างตารางการเข้าร่วมของฉันด้วยฟิลด์ข้อมูลประจำตัวที่สร้างขึ้นอัตโนมัติที่ฉันใช้เป็นคีย์หลัก
ยกเว้นกรณีที่หายากน้อยมาก (อาจเป็นตารางความสัมพันธ์แบบหลายต่อหลายคนหรือตารางที่คุณใช้ชั่วคราวสำหรับการโหลดข้อมูลจำนวนมาก) ฉันจะไปด้วยคำพูด:
หากไม่มีคีย์หลักนั่นไม่ใช่ตาราง!
มาร์ค
เพียงเพิ่มคุณจะต้องขออภัยในภายหลังเมื่อคุณไม่ได้ (การเลือกลบการเชื่อมโยง ฯลฯ )
คุณจะต้องเข้าร่วมตารางนี้กับตารางอื่น ๆ หรือไม่? คุณต้องการวิธีในการระบุบันทึกที่ไม่ซ้ำกันหรือไม่? หากคำตอบคือใช่คุณต้องมีคีย์หลัก สมมติว่าข้อมูลของคุณเป็นตารางลูกค้าที่มีชื่อของคนที่เป็นลูกค้า อาจไม่มีรหัสธรรมชาติเนื่องจากคุณต้องการที่อยู่อีเมลหมายเลขโทรศัพท์ ฯลฯ เพื่อตรวจสอบว่า Sally Smith นี้แตกต่างจาก Sally Smith หรือไม่และคุณจะเก็บข้อมูลนั้นไว้ในตารางที่เกี่ยวข้องเนื่องจากบุคคลนั้นสามารถมีโทรศัพท์ได้หลายอย่าง อีเมล ฯลฯ สมมติว่า Sally Smith แต่งงานกับ John Jones และกลายเป็น Sally Jones หากคุณไม่มีคีย์ปลอมบนตารางเมื่อคุณอัปเดตชื่อคุณเพิ่งเปลี่ยน 7 Sally Smiths เป็น Sally Jones แม้ว่าจะมีเพียงหนึ่งในพวกเขาแต่งงานและเปลี่ยนชื่อของเธอ
คุณบอกว่าคุณไม่มีคีย์ธรรมชาติดังนั้นคุณจึงไม่ได้มีชุดค่าผสมของฟิลด์ที่จะสร้างความแตกต่างเช่นนี้ทำให้คีย์ artficial สำคัญยิ่ง
ฉันพบทุกครั้งที่ฉันไม่มีคีย์ธรรมชาติคีย์ประดิษฐ์เป็นสิ่งจำเป็นอย่างยิ่งสำหรับการรักษาความถูกต้องของข้อมูล หากคุณมีคีย์ธรรมชาติคุณสามารถใช้มันเป็นฟิลด์คีย์แทน แต่โดยส่วนตัวถ้าคีย์ธรรมชาติเป็นฟิลด์เดียวฉันยังคงชอบคีย์ที่ประดิษฐ์และดัชนีที่ไม่ซ้ำกันของคีย์ธรรมชาติ คุณจะเสียใจในภายหลังหากคุณไม่ใส่ไว้ใน
เป็นวิธีปฏิบัติที่ดีที่จะมี PK ในทุกโต๊ะ แต่ไม่ใช่ต้อง ส่วนใหญ่คุณจะต้องมีดัชนีที่ไม่ซ้ำกันและ / หรือดัชนีคลัสเตอร์ (ซึ่งคือ PK หรือไม่) ขึ้นอยู่กับความต้องการของคุณ
ตรวจสอบส่วนคีย์หลักและดัชนีแบบคลัสเตอร์บน Books Online (สำหรับ SQL Server)
" ข้อ จำกัด คีย์หลักระบุคอลัมน์หรือชุดของคอลัมน์ที่มีค่าที่ระบุแถวในตารางโดยไม่ซ้ำกันไม่มีสองแถวในตารางใดสามารถมีค่าคีย์หลักเหมือนกันคุณไม่สามารถป้อน NULL สำหรับคอลัมน์ใด ๆ ในคีย์หลักเรา แนะนำให้ใช้คอลัมน์ขนาดเล็กจำนวนเต็มเป็นคีย์หลักแต่ละตารางควรมีคีย์หลักคอลัมน์หรือชุดของคอลัมน์ที่มีคุณสมบัติเป็นค่าคีย์หลักนั้นเรียกว่าคีย์ตัวเลือก "
แต่ตรวจสอบสิ่งนี้ด้วยเช่นกัน: http://www.aisintl.com/case/primary_and_foreign_key.html
ไม่เห็นด้วยกับคำตอบที่แนะนำ คำตอบสั้น ๆ คือ: NO
วัตถุประสงค์ของคีย์หลักคือการระบุแถวในตารางเพื่อสร้างความสัมพันธ์กับตารางอื่น แต่เดิมมีการใช้ค่าจำนวนเต็มแบบเพิ่มอัตโนมัติเพื่อจุดประสงค์นี้ แต่มีการเปลี่ยนแปลงไปตามนี้
แม้ว่าจะมีบางกรณีเช่นการบันทึกข้อมูลอนุกรมเวลาซึ่งการมีอยู่ของคีย์ดังกล่าวนั้นไม่จำเป็นเพียงแค่ใช้หน่วยความจำ การสร้างแถวที่ไม่เหมือนใครเป็นเพียง ... ไม่จำเป็น!
ตัวอย่างเล็ก ๆ : ตาราง A: LogData
Columns: DateAndTime, UserId, AttribA, AttribB, AttribC etc...
ไม่ต้องการคีย์หลัก
ตาราง B: ผู้ใช้
Columns: Id, FirstName, LastName etc.
ต้องการคีย์หลัก (Id) เพื่อใช้เป็น "foreign key" ในตาราง LogData
ฉันรู้ว่าในการใช้ฟีเจอร์บางอย่างของ gridview ใน. NET คุณต้องมีคีย์หลักเพื่อให้ gridview รู้ว่าแถวใดจำเป็นต้องมีการอัพเดต / ลบ การปฏิบัติทั่วไปควรจะมีคีย์หลักหรือกลุ่มคีย์หลัก ฉันชอบอดีต
เพื่อให้เป็นหลักฐานในอนาคตคุณควรทำ หากคุณต้องการทำซ้ำคุณจะต้องมี หากคุณต้องการที่จะเข้าร่วมในตารางอื่นในชีวิตของคุณ (และคนโง่ที่ต้องรักษาในปีหน้า) จะง่ายขึ้นมาก
ฉันอยู่ในบทบาทของการบำรุงรักษาแอปพลิเคชันที่สร้างขึ้นโดยทีมพัฒนาต่างประเทศ ตอนนี้ฉันมีปัญหาทุกอย่างในแอปพลิเคชันเนื่องจากสคีมาฐานข้อมูลดั้งเดิมไม่มีคีย์หลักในบางตาราง ดังนั้นโปรดอย่าปล่อยให้คนอื่นต้องทนทุกข์ทรมานเพราะการออกแบบที่ไม่ดีของคุณ เป็นความคิดที่ดีที่จะมีคีย์หลักบนตาราง
ฉันมีคีย์หลักเสมอแม้ว่าในตอนแรกฉันยังไม่มีจุดประสงค์ในใจ มีอยู่สองสามครั้งที่ในที่สุดฉันก็ต้องการ PK ในตารางที่ไม่มีสักอันและมันก็ลำบากกว่าที่จะใส่มันไว้ในภายหลัง ฉันคิดว่ามีมากกว่าที่จะรวมอยู่เสมอ
ในระยะสั้นไม่มี อย่างไรก็ตามคุณต้องจำไว้ว่าการดำเนินการเข้าถึง CRUD ของไคลเอ็นต์บางอย่างจำเป็นต้องใช้ สำหรับการพิสูจน์อักษรในอนาคตฉันมักจะใช้คีย์หลักเสมอ
หากคุณกำลังใช้ Hibernate จะไม่สามารถสร้าง Entity โดยไม่มีคีย์หลัก ปัญหานี้สามารถสร้างปัญหาได้หากคุณทำงานกับฐานข้อมูลที่มีอยู่ซึ่งสร้างขึ้นด้วยสคริปต์ sql / ddl ธรรมดาและไม่มีการเพิ่มคีย์หลัก