แน่นอนว่าข้อมูลที่เราขว้างลงไปในฐานข้อมูลนั้นแต่ละเรคคอร์ดย่อมสามารถเข้าถึงได้ด้วยคีย์ที่เรียกว่า 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 ซึ่งจากที่รวบรวมข้อมูลได้มาความแตกต่างของทั้งสองอย่างมีดังนี้
ตัวอย่างน่ะเหมียว
มาทำความเข้าใจกับตารางนี้ก่อนน่ะครับ ตารางนี้จะเก็บข้อมูล 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 ด้วย
แสดงความคิดเห็น