The Difference of Superkey and Candidate key

By Unknown | วันจันทร์, สิงหาคม 25, 2557

แน่นอนว่าข้อมูลที่เราขว้างลงไปในฐานข้อมูลนั้นแต่ละเรคคอร์ดย่อมสามารถเข้าถึงได้ด้วยคีย์ที่เรียกว่า Primary Key (PK) ซึ่งที่เราเรียนมามันก็เป็นหนึ่งในคีย์ของ Relational Keys (คีย์ที่ใช้ identify แต่ละเรคคอร์ด) และไอ้ Relational Keys ทันก็ทำให้เราสับสนเป็นไก่ตาแตกมาถึงทุกวันนี้ อาจารย์อธิบายเท่าไหร่ก็ไม่เข้าใจ ไปอ่านหนังสือก็ยิ่งไม่เข้าใจใหญ่ วันนี้เราจะมาดูความแตกต่างของคีย์แต่ละชนิดกันครับ

Relational Keys

การที่เราจะจำแนก (identify) แต่ละเรคคอร์ดนั้น เราจะเลือกแอตทริบิวต์ที่ไม่มีทางซ้ำกันแน่นอนในนารางนั้น ๆ มาเป็นตัวที่ใช้จำแนก เรียกว่า Relational Keys มีอยู่ 4 ชนิดด้วยกันคือ

Superkey
An attribute, or set of attributes, that uniquely identifies a tuple within a relaion.
Candidate key
A superkey such that no proper subset is a superkey within the relation.
Primary key
The candidate key that is seleted to identify tuples uniquely within relation.
Foreign key
An attribute, or set of attriute, within one relation that matches the candidate key of some relation.

ในส่วนที่เราจะสับสนกับคือ Superkey กับ Candidate key ซึ่งจากที่รวบรวมข้อมูลได้มาความแตกต่างของทั้งสองอย่างมีดังนี้

  • Superkey
    • แอตทริบิวต์ใด ๆ (มากกว่าหนึ่งก็ได้) ที่ไม่มีโอกาสมีค่าซ้ำกันเลยในแต่ละแถว
  • Candidate key
    • Superkey ที่มีแอตทริบิวต์เดียว
    • Super Key ที่มีหลายคอลัมน์ ซึ่งบางคอลั่มอาจจะมีความเป็นไปได้ที่ข้อมูลจะซ้ำกับเรคคอร์ดอื่น

ตัวอย่างน่ะเหมียว

มาทำความเข้าใจกับตารางนี้ก่อนน่ะครับ ตารางนี้จะเก็บข้อมูล GPS ที่ได้จากรถ ซึ่งข้อมูลของเราจะมีการอัพเดทอยู่ตลอดเวลา ทำให้แอตทริบิวต์ที่ไม่มีโอกาสซ้ำกันเลย (ยังไม่ต้องมอง id น่ะ )คือ TracDateTime (เพราะเวลามันเพิ่ใขึ้นเรื่อย ๆ ไม่มีลด หรือหยุดนิ่ง)อีกแอตทริบิวต์หนึ่งที่ไม่ควรจะมีข้อมูลที่ซ้ำกันเลยคือ TracRoadCam และ TracDriverCam ซึ่งช่องนี้จะเก็บชื่อภาพที่บันทึกได้รถตอนขับอยู่ และแน่นอนมันไม่มีทางที่จะซ้ำกันได้ เพราะแต่ละภาพก็จะถูกผูกด้วยเวลา เพื่อที่จะเอามาดูย้อนหลังได้

ทีนี้เราจะได้ว่าแอตทริบิวต์ที่มี่ค่าไม่ซ้ำกันเลยในตารางตัวอย่างนี้คือ TracDateTime, TracRoadCam และ TracDriverCam ซึ่งแอตทริบิวต์พวกนี้จัดอยู่ใน unique subset หรือเซตของแอตทริบิวต์ที่ค่าไม่ซ้ำกันเลย

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

ตัวที่เน้นหนาคือแอตทริบิวต์ที่อยู่ใน unique subset

  • id
    • id ถือเป็น superkey และ primary key จำไว้ว่า PK เป็นซับเซตของ superkey ดังนั้น PK ทุก ๆ อันจะถือว่าเป็น superkey ด้วย
  • TracDateTime
  • TracRoadCam
  • TracDriverCam
  • id, TracID
    • TracID ไม่ได้จัดอยู่ใน unique subset แต่พอนำม่ต่อกับ id แล้วก็ทำให้ค่ามัน unique อยู่ดี ก็ทำให้สองแอตทริบิวต์นี้เมื่อรวมกันก็เป็น superkey เหมือนกัน
  • id, TracID, TracLat
  • id, TracID, TracLat, TracLong
  • id, TracID, TracLat, TracLong, TracSpeed
  • id, TracID, TracLat, TracLong, TracSpeed, TracDateTime
  • id, TracID, TracLat, TracLong, TracSpeed, TracDateTime, TracRoadCam
  • id, TracID, TracLat, TracLong, TracSpeed, TracDateTime, TracRoadCam, TracDriverCam
  • id, TracID, TracLat, TracLong, TracSpeed, TracDateTime, TracRoadCam, TracDriverCam, TracIsDetected
  • TracID, TracDateTime
  • TracID, TracLat, TracDateTime
  • TracID, TracLat, TracLong, TracDateTime
  • TracID, TracLat, TracLong, TracSpeed, TracDateTime
  • TracID, TracRoadCam
  • TracID, TracLat, TracRoadCam
  • TracID, TracLat, TracLong, TracRoadCam
  • TracID, TracLat, TracLong, TracSpeed, TracRoadCam
  • TracID, TracLat, TracLong, TracSpeed, TracDateTime, TracRoadCam
  • TracID, TracDriverCam
  • TracID, TracLat, TracDriverCam
  • TracID, TracLat, TracLong, TracDriverCam
  • TracID, TracLat, TracLong, TracSpeed, TracDriverCam
  • TracID, TracLat, TracLong, TracSpeed, TracDateTime, TracDriverCam
  • TracID, TracLat, TracLong, TracSpeed, TracDateTime, TracRoadCam, TracDriverCam
  • TracID, TracLat, TracLong, TracSpeed
    • ในกรณีนี้จะเห็นว่าไม่มีแอตทริบิวต์ที่อยู่ใน unique subset เลย แต่เนื่องจากการเอาทั้งสามแอตทริบิวต์มารวมกันก็ถือว่าค่าที่ได้นั้น unique กันแล้ว ซึ่งก็จัดเป็น superkey ด้วย

ส่วนตัวอย่างของ candidate key นั้นก็ประมาณนี้

  • id
  • TracDateTime
  • TracRoadCam
  • TracDriverCam
    • superkey ที่มีแอตทริบิวต์เดียว
  • TracID, TracLat, TracLong, TracSpeed, TracIsDetected
    • ในกรณีนี้จะเห็นว่าไม่มีแอตทริบิวต์ที่อยู่ใน unique subset เลย แต่เนื่องจากการเอาทั้งสามแอตทริบิวต์มารวมกันก็ถือว่าค่าที่ได้นั้น unique กันแล้ว ซึ่งก็จัดเป็น candidate key และเป็น super key ด้วย

ขอขอบคุณข้อมูลจาก Database Systems: A Practical Approach to Design, Implementation and Management by Thomas Connolly , Carolyn Begg และคุณ na5cent ด้วยครับ

แสดงความคิดเห็น