ทำไมคีย์หลักถึงมีชื่อเป็นของตนเอง


19

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

ผลที่ตามมาคือการเปลี่ยนคีย์หลักจาก nonclustered เป็นคลัสเตอร์หรือในทางกลับกันคุณต้องค้นหาชื่อก่อนแล้วปล่อยมันและอ่านมันในที่สุด

มีประโยชน์ในการใช้ชื่อโดยพลการที่ฉันไม่เห็นหรือมี DBMS ไม่ใช้ชื่อโดยพลการสำหรับคีย์หลัก?

แก้ไข 2011-02-22 (02/22/2011 สำหรับผู้ที่ไม่ต้องการเรียงวันที่):

ให้ฉันแสดงฟังก์ชั่นที่คุณสามารถหาชื่อของคีย์หลักจากชื่อตาราง (ใช้ตารางระบบ sybase sql-Sever aka หรือต้น):

create function dbo.get_pk (@tablename sysname)
returns sysname
as
begin
    return (select k.name
    from sysobjects o 
        join sysobjects k   on k.parent_obj = o.id 
    where o.name = @tablename
    and o.type = 'U'
    and k.type = 'k')
end
go

เนื่องจาก gbn ระบุว่าไม่มีใครชอบชื่อที่สร้างขึ้นจริง ๆ เมื่อคุณไม่ระบุชื่อที่ชัดเจน:

create table example_table (
    id int primary key
)

select dbo.get_pk('example_table')  

ฉันเพิ่งได้รับ

PK__example___3213E83F527E2E1D

แต่ทำไมชื่อใน sysobjects ต้องไม่ซ้ำกัน มันจะดีพอที่จะใช้ชื่อเดียวกันสำหรับตารางและคีย์หลัก

ด้วยวิธีดังกล่าวเราไม่จำเป็นต้องตั้งค่าแบบแผนการประชุมซึ่งอาจถูกละเมิดโดยไม่ตั้งใจ

ตอนนี้คำตอบของแมเรียน:

  1. ฉันใช้งานการเปลี่ยนคลัสเตอร์เป็นคีย์หลักที่ไม่คลัสเตอร์เท่านั้นเป็นตัวอย่างที่ฉันจำเป็นต้องทราบชื่อจริงของ pk เพื่อให้สามารถวางได้
  2. สิ่งต่าง ๆ ไม่จำเป็นต้องมีชื่อที่เหมาะสมมันก็เพียงพอแล้วหากพวกเขาสามารถบอกชื่อได้อย่างง่ายดาย นั่นคือพื้นฐานของสิ่งที่เป็นนามธรรม การเขียนโปรแกรมเชิงวัตถุไปในลักษณะนี้ คุณไม่จำเป็นต้องใช้ชื่อที่แตกต่างกันสำหรับคุณสมบัติที่คล้ายกันของคลาสที่ต่างกัน
  3. มันเป็นกฎเกณฑ์เนื่องจากเป็นคุณสมบัติของตาราง ชื่อของตารางคือทั้งหมดที่คุณต้องรู้หากคุณต้องการใช้

คำตอบ:


17

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

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


1
ใช่ก็หมายความว่าคอลัมน์ใดที่ใช้เป็น PK สามารถเปลี่ยนแปลงได้ ดังนั้นสำหรับหนังสือคุณอาจใช้ ISBN เป็น PK (ซึ่งคุณต้องการโทรหา ISBN เพื่อให้ชัดเจน) แต่หลังจากนั้นครึ่งทางของการพัฒนาคุณอาจตัดสินใจว่าคุณสามารถสต็อกหนังสือมือสองได้เช่นกันซึ่งหมายความว่าคุณต้องการ บันทึกแยกต่างหาก (ตัวอย่างจากส่วนหัวของฉัน) ดังนั้นคุณจะต้องเปลี่ยนฟิลด์ PK เป็น ID ที่ไม่ซ้ำกัน
Nathan MacInnes

1
ฉันไม่ต้องการถ้อยคำ: "a PK เป็นข้อ จำกัด ที่ใช้ดัชนี" บางครั้งข้อ จำกัด ที่สอง (PK และ FK - หรือ 2 FKs) สามารถใช้ดัชนีเดียวกัน
ypercubeᵀᴹ

@ypercube ฉันชอบ"PK เป็นข้อ จำกัด ที่ใช้ดัชนีในฐานข้อมูลโลกแห่งความเป็นจริง 99.99%"ซึ่งแน่นอนว่าเป็นไปได้ที่จะมีข้อ จำกัด PK โดยไม่มีดัชนี แต่ไม่มีใครวางแผนที่จะใช้ฐานข้อมูลนั้นใน โลกแห่งความเป็นจริงจะนำไปใช้เนื่องจากเหตุผลด้านประสิทธิภาพ
Pacerier

6

ไม่แน่ใจว่าฉันเข้าใจคำถามทั้งหมด

หากคุณมีดัชนีบนโต๊ะและคุณต้องการ / จำเป็นต้องเปลี่ยนดัชนีคุณไม่จำเป็นต้องเปลี่ยนมันตามชื่อหรือไม่ ฉันคิดว่าคุณสามารถค้นหา objectID สำหรับดัชนีและทำการปรับปรุงแบบนั้นได้ แต่ชื่อมีแนวโน้มที่จะช่วยให้ผู้คนเข้าใจอย่างมีเหตุผลเกี่ยวกับวัตถุที่พวกเขากำลังทำงานด้วย

ดังนั้นบางทีคำตอบก็คือหากคุณมีแผนการใช้ชื่อที่รัดกุม (เช่น name_PK สำหรับคีย์หลัก) คุณจะสามารถระบุได้อย่างง่ายดายว่าคุณกำลังทำงานกับคีย์หลักของตาราง

ฉันคิดว่าสิ่งเดียวกันอาจถูกกล่าวเพื่อกำหนดความสัมพันธ์ FK ฉันคิดว่าการใช้ชื่อนั้นทำขึ้นเพื่อการตีความเชิงตรรกะเนื่องจากวัตถุทั้งหมดนั้นมี objectID ที่แตกต่างกัน


5

ฉันจะบอกว่ามันเป็นรายละเอียดการใช้งานเพื่อให้มนุษย์สามารถอ่านได้

ชื่อเป็นตัวเลือก จำกัด (ใน SQL Server อย่างน้อย) แต่ผมต้องการที่จะมีPK_MyTableสำหรับMyTableมากกว่าPK_MyTabl___16feb6d8a


3

ในอดีตคีย์หลักและคีย์เฉพาะทั้งหมดเรียกว่าคีย์ผู้สมัครตามที่สอนโดย Christopher J. Date

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

ด้วยเหตุนี้ชื่อ Primary KEY จึงเป็นชื่อที่ต้องการโดยพลการของคีย์ตัวเลือกที่ต้องการซึ่งแนบมาเป็นคุณสมบัติตาราง สามารถมีได้เพียงหนึ่งคีย์หลักเท่านั้น

ในความเป็นจริงการสร้างคีย์ผู้สมัครที่มีชื่อควรจะพอเพียง

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

คลิกที่นี่เพื่อดูคำจำกัดความของคีย์ผู้สมัครและความคิดเห็นของ CJDate


1

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

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