คีย์หลักหรือดัชนีเฉพาะ?


127

ในที่ทำงานเรามีฐานข้อมูลขนาดใหญ่ที่มีดัชนีเฉพาะแทนคีย์หลักและทั้งหมดทำงานได้ดี

ฉันกำลังออกแบบฐานข้อมูลใหม่สำหรับโปรเจ็กต์ใหม่และฉันมีปัญหา:

ในทฤษฎี DB คีย์หลักเป็นองค์ประกอบพื้นฐานก็โอเค แต่ในโครงการ REAL ข้อดีและข้อเสียของทั้งสองอย่างคืออะไร?

คุณใช้อะไรในโครงการ?

แก้ไข: ... แล้วคีย์หลักและการจำลองแบบบนเซิร์ฟเวอร์ MS SQL ล่ะ?


2
มีข้อพิจารณาเพิ่มเติมบางประการที่กล่าวถึงที่นี่ (แม้ว่าจะมีบริบทเพิ่มเติมของดัชนีที่ครอบคลุม) - dba.stackexchange.com/questions/21554/…
StuartLC

หมายเหตุ: SQLite แตกต่างกันตรงที่อนุญาตให้คีย์หลักเป็นโมฆะเทียบกับมาตรฐานทั่วไปเนื่องจากปัญหาเดิม sqlite.org/lang_createtable.html
bitinn

คำตอบ:


168

ดัชนีเฉพาะคืออะไร?

ดัชนีที่ไม่ซ้ำกันในคอลัมน์คือดัชนีในคอลัมน์นั้นซึ่งบังคับใช้ข้อ จำกัด ที่คุณไม่สามารถมีค่าเท่ากันสองค่าในคอลัมน์นั้นในสองแถวที่ต่างกัน ตัวอย่าง:

สร้างตาราง table1 (foo int, bar int);
สร้าง UNIQUE INDEX ux_table1_foo บน table1 (foo); - สร้างดัชนีเฉพาะบน foo

INSERT INTO table1 (foo, bar) VALUES (1, 2); -- ตกลง
INSERT INTO table1 (foo, bar) VALUES (2, 2); -- ตกลง
INSERT INTO table1 (foo, bar) VALUES (3, 1); -- ตกลง
INSERT INTO table1 (foo, bar) VALUES (1, 4); - ล้มเหลว!

รายการที่ซ้ำกัน '1' สำหรับคีย์ 'ux_table1_foo'

การแทรกครั้งสุดท้ายล้มเหลวเนื่องจากละเมิดดัชนีเฉพาะในคอลัมน์fooเมื่อพยายามแทรกค่า 1 ลงในคอลัมน์นี้เป็นครั้งที่สอง

ใน MySQL ข้อ จำกัด เฉพาะทำให้มี NULL หลายตัว

เป็นไปได้ที่จะสร้างดัชนีเฉพาะในหลายคอลัมน์

คีย์หลักเทียบกับดัชนีเฉพาะ

สิ่งที่เหมือนกัน:

  • คีย์หลักหมายถึงดัชนีเฉพาะ

สิ่งที่แตกต่าง:

  • คีย์หลักยังหมายความว่าไม่เป็นโมฆะ แต่ดัชนีเฉพาะสามารถเป็นโมฆะได้
  • สามารถมีคีย์หลักได้เพียงคีย์เดียว แต่อาจมีดัชนีที่ไม่ซ้ำกันได้หลายรายการ
  • หากไม่มีการกำหนดดัชนีคลัสเตอร์คีย์หลักจะเป็นดัชนีคลัสเตอร์

4
โปรดทราบว่าดัชนีที่ไม่ซ้ำกันคือดัชนีในคอลัมน์นั้นไม่ถูกต้องทั้งหมดเนื่องจากดัชนีที่ไม่ซ้ำกันหนึ่งรายการหรือคีย์หลักสามารถรวมได้มากกว่าหนึ่งคอลัมน์
Alex Jasmin

2
@Alexandre Jasmin: ขอบคุณแน่นอน ส่วนที่เกี่ยวกับหลายคอลัมน์จะกล่าวถึงในภายหลัง
มาร์คบายเออร์

ด้วยการอ้างอิงถึง null มาตรฐาน ansi อนุญาตให้มีค่า null หลายค่าในชุดข้อมูลที่มีข้อ จำกัด เฉพาะและนั่นคือการนำไปใช้กับ Oracle และ PostgreSQL ฉันเชื่อว่า SQL Server อนุญาตให้มีค่า null เพียงค่าเดียวเท่านั้น
David Aldridge

3
แต่ฉันยังไม่เข้าใจเช่นเมื่อใดควรใช้คีย์หลักหรือเมื่อใดควรใช้ดัชนีเฉพาะ หรืออาจเป็นทั้งสองอย่างในสถานการณ์เดียวกัน
Amit

33

คุณสามารถเห็นได้ดังนี้:

คีย์หลักไม่ซ้ำกัน

ค่าเฉพาะไม่จำเป็นต้องเป็นตัวแทนขององค์ประกอบ

ความหมาย ?; คีย์หลักใช้เพื่อระบุองค์ประกอบหากคุณมี "บุคคล" คุณต้องการมีหมายเลขประจำตัวส่วนบุคคล (SSN หรือเช่นนั้น) ซึ่งเป็นหมายเลขหลักสำหรับบุคคลของคุณ

ในทางกลับกันบุคคลนั้นอาจมีอีเมลที่ไม่ซ้ำกัน แต่ไม่ได้ระบุตัวบุคคล

ฉันมีคีย์หลักเสมอแม้ในตารางความสัมพันธ์ (ตารางกลาง / ตารางการเชื่อมต่อ) ฉันอาจมีมัน ทำไม? ฉันชอบที่จะทำตามมาตรฐานเมื่อเขียนโค้ดถ้า "บุคคล" มีตัวระบุรถก็มีตัวระบุแล้วบุคคล -> รถก็ควรมีตัวระบุเช่นกัน!


ในตารางความสัมพันธ์ของคุณ: คุณหมายความว่าคุณแนะนำคอลัมน์ใหม่ด้วยคีย์หลักเทียม (เช่นจำนวนเต็ม) หรือคุณใช้คีย์หลักที่ประกอบด้วย (person_id, car_id)?

3
คีย์หลัก (person_id, car_id) จะดีที่สุด แต่โดยทั่วไปฉันจะสร้างคอลัมน์ใหม่แน่ใจว่ามันให้ค่าใช้จ่ายบางส่วน แต่ฉันคิดว่ามันดี คุณไม่มีทางรู้ว่าคุณต้องการเชื่อมโยงกับความสัมพันธ์เฉพาะในสถานการณ์ต่อไปหรือไม่
Filip Ekberg

1
สิ่งอื่น ๆ ที่คีย์หลักตัวแทนทำสำหรับตารางคอมโพสิต / เข้าร่วมของคุณคือการบำรุงรักษางานด้วยตนเองที่ง่ายดาย
Robert C.Barth

2
คุณต้องมีคีย์หลักก็ต่อเมื่อคุณกำลังจะมีลูก เหตุใดจึงต้องเพิ่มคอลัมน์และลำดับหากค่าไม่ปรากฏที่ใดหากไม่มีการใช้ค่าเพื่ออะไร เป็นการสร้างผลงานเพื่อหยุดการเข้าถึงจากการขอ PK ทำการ PK หากคุณต้องการระบุบันทึกในเด็กมิฉะนั้นจะเป็นการสูญเปล่า

3
ถ้ามันไม่มีอะไรเกี่ยวกับความสัมพันธ์มันเกี่ยวข้องกับอะไร? คุณชี้ไปที่ฟิลด์และพูดว่านั่นคือหลัก และ? แล้วจะเกิดอะไรขึ้น? และถ้าไม่มี pk ตามธรรมชาติฉันจะเพิ่มคอลัมน์และลำดับและทริกเกอร์และทั้งหมดเป็นเพราะ ____? บางคนต้องเป็นเด็กปฐมวัย ฉันละทิ้งกฎโดยไม่มีเหตุผล

10

คีย์ต่างประเทศทำงานร่วมกับข้อ จำกัด เฉพาะเช่นเดียวกับคีย์หลัก จากหนังสือออนไลน์:

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

สำหรับการจำลองแบบธุรกรรมคุณต้องมีคีย์หลัก จากหนังสือออนไลน์:

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

คำตอบทั้งสองสำหรับ SQL Server 2005


นั่นทำให้ฉันกลัวนรก (คำพูดแรก) ทำไม? ฉันมีตารางบุคคลที่มี ID โดยพลการนั่นคือ PK ของฉัน แต่ฉันตัดสินใจที่จะเพิ่มสหราชอาณาจักรในโทรศัพท์อีเมลและ SSN ... ดังนั้นตอนนี้ 4 ตารางที่แตกต่างกันจะเข้าร่วมกับบุคคลใน 4 คอลัมน์ที่แตกต่างกัน? ฉันคิดว่าฉันจะละทิ้งความยืดหยุ่นที่คุณอาจได้รับเพื่อความสม่ำเสมอ

5

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

ตัวอย่างเช่นฉันมีตารางต่อไปนี้:

CREATE TABLE toll_booths (
    id            INTEGER       NOT NULL PRIMARY KEY,
    name          VARCHAR(255)  NOT NULL,
    ...
    UNIQUE(name)
)

CREATE TABLE cars (
    vin           VARCHAR(17)   NOT NULL PRIMARY KEY,
    license_plate VARCHAR(10)   NOT NULL,
    ...
    UNIQUE(license_plate)
)

CREATE TABLE drive_through (
    id            INTEGER       NOT NULL PRIMARY KEY,
    toll_booth_id INTEGER       NOT NULL REFERENCES toll_booths(id),
    vin           VARCHAR(17)   NOT NULL REFERENCES cars(vin),
    at            TIMESTAMP     DEFAULT CURRENT_TIMESTAMP NOT NULL,
    amount        NUMERIC(10,4) NOT NULL,
    ...
    UNIQUE(toll_booth_id, vin)
)

เรามีตารางเอนทิตีสองตาราง ( toll_boothsและcars) และตารางธุรกรรม ( drive_through) toll_boothตารางใช้คีย์ตัวแทนเพราะมันไม่มีแอตทริบิวต์ธรรมชาติที่ไม่รับประกันการเปลี่ยนแปลง (ชื่อที่สามารถเปลี่ยนแปลงได้ง่าย) carsตารางใช้คีย์หลักธรรมชาติเพราะมีการเปลี่ยนแปลงที่ไม่ระบุที่ไม่ซ้ำ ( vin) drive_throughตารางการทำธุรกรรมใช้คีย์ตัวแทนแยกแยะได้ง่าย แต่ยังมีข้อ จำกัด ที่ไม่ซ้ำกันในลักษณะที่มีการรับประกันจะไม่ซ้ำกันในเวลาที่บันทึกจะถูกแทรก

http://database-programmer.blogspot.comมีบทความดีๆเกี่ยวกับเรื่องนี้โดยเฉพาะ


4

ไม่มีข้อเสียของคีย์หลัก

หากต้องการเพิ่มข้อมูลเพียงบางส่วนในคำตอบของ @MrWiggles และ @Peter Parker เมื่อตารางไม่มีคีย์หลักเช่นคุณจะไม่สามารถแก้ไขข้อมูลในบางแอปพลิเคชัน (พวกเขาจะลงท้ายว่า sth like ไม่สามารถแก้ไข / ลบข้อมูลได้หากไม่มี คีย์หลัก) Postgresql อนุญาตให้ค่า NULL หลายค่าอยู่ในคอลัมน์ UNIQUE PRIMARY KEY ไม่อนุญาตให้ใช้ NULL นอกจากนี้ ORM บางตัวที่สร้างโค้ดอาจมีปัญหากับตารางที่ไม่มีคีย์หลัก

UPDATE:

เท่าที่ฉันรู้เป็นไปไม่ได้ที่จะจำลองตารางโดยไม่มีคีย์หลักใน MSSQL อย่างน้อยก็ไม่มีปัญหา ( รายละเอียด )


มีค่าใช้จ่ายเมื่อมีการแทรกแถวใหม่หรือมีการอัปเดตคอลัมน์นั้น

3

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


3
ตารางจะจัดเรียงตามดัชนีคลัสเตอร์ที่ไม่จำเป็นต้องใช้คีย์หลัก
Ray Booysen

1
มันก็เกิดขึ้นที่คนส่วนใหญ่ตั้งค่าคีย์หลักเป็นดัชนีคลัสเตอร์
Ray Booysen

ซึ่งเรารู้ว่ามักจะเป็นความคิดที่ไม่ดีจริงๆเว้นแต่ว่าเราจะชอบฮอตสปอตและดัชนีต้นไม้ที่ไม่สมดุลในตารางของเราแน่นอน ...
Mike Woodhouse

1
ไม่ใช่ความคิดที่แย่เสมอไป รู้ข้อมูลของคุณรู้จัก RDBMS ของคุณรู้ความหมายของตัวเลือก ไม่ค่อยมีทางเลือกดีหรือไม่ดีเสมอไป ถ้าเป็นเสมอฐานข้อมูลจะมอบอำนาจหรือไม่อนุญาต พวกเขาให้คุณเลือกเพราะ 'มันขึ้นอยู่กับ'

2

นอกเหนือจากสิ่งที่คำตอบอื่น ๆ ได้กล่าวไว้แล้วฐานข้อมูลและระบบบางอย่างอาจต้องใช้หลักในการนำเสนอ สถานการณ์หนึ่งอยู่ในใจ เมื่อใช้การจำลองแบบองค์กรกับ Informix ต้องมี PK สำหรับตารางเพื่อเข้าร่วมในการจำลองแบบ


2

ตราบเท่าที่คุณไม่อนุญาตให้มีค่า NULL สำหรับค่าพวกเขาควรได้รับการจัดการเหมือนกัน แต่ค่า NULL จะได้รับการจัดการที่แตกต่างกันบนฐานข้อมูล (AFAIK MS-SQL ไม่อนุญาตให้มีค่า NULL มากกว่าหนึ่ง (1) mySQL และ Oracle อนุญาต ถ้าคอลัมน์ไม่ซ้ำ) ดังนั้นคุณต้องกำหนดคอลัมน์นี้ไม่ใช่ NULL UNIQUE INDEX


1
MS-SQL อนุญาตให้มีค่า NULL หลายค่าในคอลัมน์ที่มีดัชนีเฉพาะเช่นเดียวกับทุก RDBMS คิดอย่างนี้: NULL ไม่ใช่ค่าดังนั้นเมื่อคุณแทรก NULL ที่สองค่านี้จะไม่ตรงกับค่าที่มีอยู่ นิพจน์ (NULL == NULL) ไม่ได้รับการประเมินว่าเป็นจริงหรือเท็จ แต่จะประเมินเป็น NULL
gregmac

thanx gregmac ฉันไม่แน่ใจว่า MS เป็นไปตามนี้หรือไม่ ฉันจำ MS Quirks เกี่ยวกับเรื่องนี้ได้ แต่เมื่อหลายปีก่อน (ก่อนปี 2000) และอาจเป็นไอ
Peter Parker

2

ไม่มีสิ่งที่เรียกว่าคีย์หลักในทฤษฎีข้อมูลเชิงสัมพันธ์ดังนั้นคำถามของคุณจะต้องได้รับคำตอบในระดับปฏิบัติ

ดัชนีเฉพาะไม่ได้เป็นส่วนหนึ่งของมาตรฐาน SQL การนำ DBMS ไปใช้งานโดยเฉพาะจะเป็นตัวกำหนดว่าผลของการประกาศดัชนีเฉพาะคืออะไร

ใน Oracle การประกาศคีย์หลักจะส่งผลให้มีการสร้างดัชนีเฉพาะในนามของคุณดังนั้นคำถามจึงเกือบจะสงสัย ฉันไม่สามารถบอกคุณเกี่ยวกับผลิตภัณฑ์ DBMS อื่น ๆ

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


คีย์หลักใน MS SQL Server จะเป็นทั้ง UNIQUE และ NOT NULL เสมอเช่นมันเป็นเพียงดัชนีเฉพาะ แต่มีข้อ จำกัด เพิ่มเติมที่ไม่สามารถเป็น NULL ได้
marc_s

Oracle สามารถบังคับใช้ Unique Constraint ด้วยดัชนีที่ไม่ซ้ำกัน ฉันจะแปลกใจถ้า MSSS ทำไม่ได้ การพูดว่า "มันเป็นเพียงดัชนีที่ไม่ซ้ำใครจริงๆ" เป็นการทำลาย

"ในหลาย ๆ กรณีการประกาศดัชนีบน coulmn ของคีย์ต่างประเทศจะทำให้การรวมเร็วขึ้น" สิ่งนี้แทบจะไม่เป็นความจริงในโลกของคลังข้อมูลที่การรวมแฮชจะเป็นที่ต้องการหากมี
JAC2703

OP ไม่ได้พูดถึงคลังสินค้า ฉันไม่แน่ใจว่า hash loins ทำงานบนเซิร์ฟเวอร์ sql อย่างไร สามารถทำงานได้เท่าไหร่ในเวลาปรับปรุงคลังสินค้า
Walter Mitty

2

มีข้อเสียบางประการของ CLUSTERED INDEXES เทียบกับ UNIQUE INDEXES

ตามที่ระบุไว้แล้ว CLUSTERED INDEX จะสั่งซื้อข้อมูลในตาราง

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

ในตารางขนาดเล็กที่สัมพันธ์กันนี่เป็นเรื่องปกติ แต่เมื่อไปที่ตารางที่มีข้อมูลเป็น GB และตัวแทรก / ลบมีผลต่อการจัดเรียงคุณจะพบปัญหา


แล้วมีข้อดีคืออะไร? การค้นหาที่เรียงลำดับเร็วกว่า? วิธีนี้จะดีกว่าสำหรับกรณีการใช้งานหรือไม่เมื่อคุณเขียนข้อมูลส่วนใหญ่เพียงครั้งเดียว (หรือน้อยครั้งมาก) และค้นหาข้อมูลตลอดเวลา
บัฟฟาโล

1

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

ไม่กี่ครั้งที่ฉันไม่สร้างคีย์ตัวแทนคือเมื่อฉันมีตารางการเข้าร่วมที่เกี่ยวข้องกับความสัมพันธ์แบบกลุ่มต่อกลุ่ม ในกรณีนี้ฉันประกาศทั้งสองฟิลด์เป็นคีย์หลัก


“ ฉันแทบไม่เคยสร้างตารางโดยไม่มีคีย์หลักที่เป็นตัวเลขเลย”: ทำไมต้องเป็นตัวเลข? คีย์หลักไม่จำเป็นต้องเป็นตัวเลข (ไม่จำเป็นต้องเป็น AUTO_INCREMENT ก็ตาม)
Hibou57

@ Hinou57 เพราะฉันพบว่าจริงๆแล้วคีย์ธรรมชาตินั้นแทบจะไม่ซ้ำกันเลยและแทบจะเปลี่ยนแปลงได้ตลอดเวลา Furthere เข้าร่วมกับ intergers โดยทั่วไปจะเร็วกว่าการเชื่อมต่อกับคีย์ธรรมชาติ varcahrr หรือคีย์คอมโพสิตที่แย่กว่ามาก ฉันจะไม่ใช้มันเกือบตลอดเวลา ซึ่งอาจแตกต่างกันไปตามประเภทของข้อมูลที่คุณจัดเก็บในฐานข้อมูลของคุณ แต่จากประสบการณ์ส่วนตัวของฉันฉันพบว่ากุญแจธรรมชาติไม่น่าเชื่อถืออย่างยิ่งเมื่อเวลาผ่านไป
HLGEM

ขอบคุณสำหรับการตอบกลับ HLGEM คุณหมายถึงอะไรกับความไม่น่าเชื่อถือ? ประสิทธิภาพ? (ฉันหวังว่านั่นจะไม่ใช่เรื่องของความน่าเชื่อถือในแง่ของความสมบูรณ์ของข้อมูล) ฉันรู้สึกประหลาดใจเล็กน้อยกับคำพูดของคุณในขณะที่ฉันใช้คีย์จำนวนเต็มหรือคีย์ธรรมชาติเช่น VARCHAR แบบสั้นก็น่าจะสร้างความแตกต่างเพียงเล็กน้อยเนื่องจากมีการใช้แฮชทุกที่แม้จะใช้ DB Engine ที่เรียบง่ายที่สุดก็ตาม
Hibou57

พวกเขาไม่น่าเชื่อถือในหลาย ๆ กรณีเนื่องจากพวกเขาไม่ได้มีเอกลักษณ์ที่น่าเชื่อถือแม้ว่าจะควรจะเป็นก็ตาม พวกเขาไม่น่าเชื่อถือเนื่องจากมีการเปลี่ยนแปลงและอาจส่งผลกระทบต่อบันทึกหลายล้านรายการใน uopdate นี่เป็นประสบการณ์ของฉันที่ได้เห็นและจัดการหรือสืบค้นข้อมูลจากหรือนำเข้าข้อมูลจากฐานข้อมูลหลายร้อยแห่งที่เก็บข้อมูลเกี่ยวกับข้อมูลประเภทต่างๆมากมาย
HLGEM

1

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

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

(*) ยกเว้นความแตกต่างในทางปฏิบัติ: คีย์หลักอาจเป็นคีย์เฉพาะเริ่มต้นสำหรับการดำเนินการบางอย่างเช่นการกำหนดคีย์ต่างประเทศ อดีต ถ้าใครกำหนดคีย์ต่างประเทศที่อ้างอิงตารางและไม่ได้ระบุชื่อคอลัมน์หากตารางที่อ้างอิงมีคีย์หลักคีย์หลักจะเป็นคอลัมน์ที่อ้างอิง มิฉะนั้นคอลัมน์ที่อ้างอิงจะต้องได้รับการตั้งชื่ออย่างชัดเจน

คนอื่น ๆ ในที่นี้ได้กล่าวถึงการจำลองแบบ DB แต่ฉันไม่รู้เกี่ยวกับเรื่องนี้


0

ดัชนีเฉพาะสามารถมีค่า NULL ได้หนึ่งค่า สร้างดัชนีที่ไม่คลัสเตอร์ คีย์หลักต้องไม่มีค่า NULL สร้างดัชนีแบบคลัสเตอร์


0

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


-1

ถ้ามันขึ้นอยู่กับฉัน ...

คุณต้องปฏิบัติตามข้อกำหนดของฐานข้อมูลและแอปพลิเคชันของคุณ

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

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

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

ฉันทุกคนใช้ดัชนีประเภทคำนวณหรือฟังก์ชัน - และขอแนะนำให้ใช้ดัชนีเหล่านี้กับดัชนีคอมโพสิต มันทำให้ง่ายมากที่จะใช้ดัชนีฟังก์ชันโดยใช้ฟังก์ชันเดียวกันในส่วนคำสั่ง where ของคุณ

สิ่งนี้จะดูแลความต้องการในการสมัครของคุณ

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

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