Key ใน RDBMS

Key ใน RDBMS (Relational Database Management System) Key คือสิ่งที่จะใช้เชื่อมโยง Relation ทั้งหลาย มีสถานะเป็นตัวแทนของระเบียนนั้นโดยเฉพาะ และเป็นตัวช่วยระบุความสัมพันธ์ระหว่างตาราง อาจจะเป็นข้อมูลในคอลัมน์ใดคอลัมน์หนึ่ง หรือ หลายคอลัมน์ รวมกันก็ได้ เราจะเรียกคอลัมน์ที่ใช้เป็นตัวแทนนั้นว่า Key Column ส่วนคอลัมน์ที่ไม่ได้ใช้เป็นตัวแทน จะเรียกว่า Non-Key Column

Key ใน RDBMS มีอะไรบ้าง?

ความจริงแล้ว key ที่อยากจะพูดถึงมีเพียงแค่ Primary Key กับ Foreign Key เพียงสองอย่างเท่านั้นที่จะต้องมีความเข้าใจเพื่อเป็นพื้นฐานก่อนพูดถึง Relation แต่มาฉุกคิดว่า ไหน ๆ ก็จะเขียนแล้ว ควรจะพูดถึงที่มาของ Key ใน RDBMS เชิงทฤษฎีบ้าง เผื่อจะช่วยให้ลำดับความเข้าใจในที่มาว่าเป็นมาอย่างไร จึงได้ใส่เรื่อง Super Key Candidate Key Composite Key เข้ามาด้วย เผื่อในอนาคตที่จะเขียนถึงเกี่ยวกับเรื่อง database อาจจะต้องอ้างคำพวกนี้บ้าง

และเพื่อความเข้าใจอันดีระหว่างกัน โปรดทำความเข้าใจคำที่จะใช้ เพราะ datarevol อาจเผลอใช้สลับกันไปมา ดังนี้

คอลัมน์ (column) กับ Attribute กับ เขตข้อมูล คือสิ่งเดียวกัน แต่ถ้าจะถูกให้ถูกต้องตามหลักการ เราจะเรียกว่า attribute (แต่ส่วนตัวชอบใช้ คอลัมน์ เพราะคนเข้าใจง่ายกว่า)

แถว (row) กับ Tuple กับ ระเบียน กับ Record คือสิ่งเดียวกัน แต่ถ้าจะถูกให้ถูกต้องตามหลักการ เราจะเรียกว่า Tuple  (แต่ส่วนตัวชอบใช้ แถว เพราะคนเข้าใจง่ายกว่า)

Relation

ในบล็อกที่จะเขียนต่อไปนี้จะพยายามใช้คำว่า Attribute กับ Tuple ให้มากที่สุด แต่อาจจะใช้สลับกันบ้าง เพราะเขียน ๆ ไปอาจจะเผลอบ้าง ต้องขออภัย เข้าใจกันเนาะ จะได้เขียนต่อละนะจ๊ะ

Super Key

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

แต่ถ้าใช้หมดทุก Attribute ก็ไม่มีความจำเป็นต้องใช้เป็น key เว้ย!

คือ ตรงนี้เรากำลังพูดในเรื่องทฤษฎี หรือ คำจำกัดความ ดังนั้น เอาแค่นี้ก่อน Super Key มันเป็นแค่สิ่งที่ “ไม่ซ้ำ”

มาดูวิธีการคิดอย่างเป็นขั้นตอนของ super key ก่อน ว่ามาจากไหน จากตัวอย่าง เป็น ตาราง Orders ของ ฐานข้อมูล Northwinds นะจ๊ะ ถ้าท่านต้องการฐานข้อมูลนี้ ให้ทำดังนี้

#1 – เปิด Access
#2 – ที่ด้านบนสุด จะเห็น “search for online templates” ให้พิมพ์ “Northwinds”
#3 – คลิกที่ชื่อฐานข้อมูล แล้วกดสร้าง database

สำหรับตาราง Orders DataRevol เอาไปวางใน Excel โปรดดูรูปประกอบ

Key ใน RDBMS
ตัวอย่างที่มีหลายคอลัมน์เหลือเกิน เก็บมาไม่หมด!

1 สร้าง key โดยเรียง Attribute ทั้งหมด

อย่างแรกเลย เราเอา Attribute แต่ละอัน มาเรียงกันไปทีละ Attribute เช่น

ก็จะได้เป็น

  • Order ID
  • Employee
  • Customer
  • Order Date

ไปจนถึง Attribute สุดท้ายคือ Status ID

แล้วเราก็เอามาผสมกัน เริ่มจาก 2 Attribute ตัวอย่างเช่น

  • Order ID + Employee
  • Order ID + Customer
  • Order ID + Order Date

ไปจนถึง Order ID + Status ID

แล้วก็วนไปที่

  • Employee + Customer
  • Employee + Order Date

ไปจนถึง Employee + Status ID

สลับไปแบบนี้เรื่อย ๆ ซึ่งขอข้าม เพราะมันจะยาวมาก ไม่น่าเลือกตารางนี้เลยวุ้ย คอลัมน์เยอะเกินไป ซึ่งสุดท้าย จะไปจบที่การเอา Attribute ทั้งหมดมารวมกัน

Order ID+Employee+Customer+Order Date+Shipped Date+Ship Via          +Ship Name+Ship Address+ไปจนถึง Status ID

หมายเหตุ: สำหรับการนำ Attribute หรือ คอลัมน์ มากกว่า 1 Attribute หรือ คอลัมน์ มารวมกันเพื่อเป็น Key นี้ เราเรียกว่า Composite Key

2 – กำจัดสิ่งที่ไม่มีคุณสมบัติของ Super Key

แต่การจะเป็น super key ได้ ต้องมีคุณสมบัติอย่างหนึ่ง คือ “จะต้องไม่มีค่าซ้ำ” ดังนั้น สิ่งที่เราเรียงลำดับมาในข้อ 1 อันไหนที่มีค่าซ้ำ กำจัดทิ้งไปเลยจ้ะ เช่น

  • Employee กำจัดทิ้ง เพราะมีค่าซ้ำ
  • Customer กำจัดทิ้ง เพราะมีค่าซ้ำ
  • Employee + Employee กำจัดทิ้ง เพราะมีค่าซ้ำ

ทำแบบนี้ไปเรื่อย ๆ จะได้ Super Key ที่เอาไปใช้งานจริงได้ ตัวอย่างเช่น

  • Order ID เพราะ คอลัมน์นี้ ไม่มีค่าซ้ำใดใดเกิดขึ้น
  • Order ID + Employee เพราะ เมื่อนำ 2 คอลัมน์นี้มารวมกัน ไม่มีค่าซ้ำใดใดเกิดขึ้น
  • Employee + Customer + Order Date เพราะ เมื่อนำ 3 คอลัมน์นี้มารวมกัน จะไม่มีการซ้ำกันเกิดขึ้น

แบบนี้เป็นต้น

แต่ไม่ใช่ว่า Super Key ทุกอันจะเหมาะสมกับการเอาไปใช้ เช่น

Order ID+Employee+Customer+Order Date+Shipped Date+Ship Via          +Ship Name+Ship Address+ไปจนถึง Status ID

นั่นคือครบทุก Attributes ซึ่งจะไม่มีค่าซ้ำ แต่ แบบนี้จะเอาไปใช้ประโยชน์อะไรไม่ได้เลย มันจึงต้องมีการทำ candidate หรือ หาผู้ท้าชิง อีกรอบ

หมายเหตุ เขียนตรง Super Key ยาวใช่มั้ยจ๊ะ ความจริงตรงนี้ไม่อธิบายข้อ 1 และ 2 เลยก็ได้ เพราะเวลาทำงานจริง ส่วนใหญ่คนทำจะรู้อยู่แก่ใจแล้วว่าจะใช้ Attribute หรือ กลุ่มของ Attribute ไหนในการใช้เป็น Primary Key แต่อยากให้เห็น คอนเซ็ปต์ หรือ แนวคิดเบื้องต้นกันละนะ ว่าตามทฤษฎีแล้วมันมีที่มาที่ไปอย่างไร

Candidate Key

อย่างที่บอกข้างต้นว่า Super Key ที่ลิสต์ออกมาได้นั้น ใช่ว่าจะเหมาะสมกับการนำไปใช้งานทั้งหมด เราจะต้องมีการหา Candidate หรือ คู่ท้าชิง โดยนำ Super Key ทั้งหมด มาพิจารณาว่าจะมีคุณสมบัติพอจะเป็น “ผู้ท้าชิง” หรือไม่

โดยคุณสมบัติที่ว่านั้น ง่ายมาก คือ ถ้า Super Key เกิดจาก Attribute เพียง Attribute เดียว ให้ถือเป็น Candidate Key แต่ถ้า Super Key นั้นเป็น Composite Key ให้ดูว่า Attribute ที่นำมาประกอบกันนั้น มี Attribute ใดที่เป็น Super Key ในตัวเองบ้าง ถ้ามี ให้กำจัดทิ้ง ถือว่าไม่มีคุณสมบัติพอจะเป็น Candidate Key

ลองมาดูตัวอย่างเดิม ตาราง Order

Order ID เป็น super key เกิดจาก Attribute เพียง Attribute เดียว คอลัมน์นี้ เป็น Candidate Key

Employee + Customer + Order Date เป็น super key แบบ Composite Key เพราะ เมื่อนำ 3 คอลัมน์ นี้มารวมกัน จะไม่มีการซ้ำกันเกิดขึ้น และเมื่อพิจารณา Employee Customer และ Order Date แยกกันแล้ว ไม่มี Attribute ใดเป็น Super Key ดังนั้น เป็น Candidate Key ได้

Order ID + Employee เป็น super key แบบ Composite Key เพราะ เมื่อนำ 2 คอลัมน์ นี้มารวมกัน จะไม่มีการซ้ำกันเกิดขึ้น แต่ว่า Attribute Order ID เป็น Super Key มีความเป็น unique คือ ไม่มีค่าซ้ำเลย ดังนั้น Order ID + Employee จึง ไม่เป็น Candidate Key

Primary Key

ในบรรดา Key ใน RDBMS เมื่อมีการพิจารณาแล้วว่า Super Key ใด เป็น Candidate Key บ้าง เราก็สามารถพิจารณา key ที่จะใช้เป็น Primary Key หรือ คีย์หลัก ที่สามารถเป็นตัวแทนของ tuple (หรือ ระเบียน หรือ แถว) ซึ่งจากหัวข้อที่ผ่าน ๆ มา เราได้คุณสมบัติเบื้องต้นมาแล้วว่า

  • ข้อมูลใน Attribute หรือ กลุ่ม Attribute นั้น จะไม่มีค่าซ้ำกันใน (จึงจะเป็น Super Key ได้)
  • เป็น Candidate key คือ ในกรณีที่เป็นกลุ่ม Attribute จะไม่มี Attribute ใดเลยที่เป็น Super Key ลดความซ้ำซ้อนโดยไม่จำเป็น

คุณสมบัติเพิ่มเติม สำหรับการพิจารณ์เลือก Candidate key นั้นให้เป็น Primary key ก็คือ

  • ไม่เป็นค่าว่าง ทุกระเบียน จะต้องมีค่านี้เสมอ
  • เป็นค่าที่ไม่เปลี่ยน หรือ นาน ๆ จะเปลี่ยนที
  • และจะเลือกจาก Candidate key ที่มีจำนวน Attribute น้อยที่สุดก่อน

ยกตัวอย่าง โดยเอาข้อมูลตาราง Orders ของฐานข้อมูล Northwind มาให้ดูเพื่อให้เห็นภาพ เวลาเห็นข้อมูลแบบนี้ เราระบุได้เลยว่า Primary Key ก็คือ Order ID เพราะ นี่คือ Super Key ตัวเดียวที่มี Attribute เพียงแค่ 1 Attribute เท่านั้น

(เอาจริง DataRevol อาจไม่จำเป็นต้องเขียนถึง Key ใน RDBMS พวก Super Key, Candidate key ให้ยุ่งยากและยืดยาวเปล่า ๆ ก็ได้นะนี่ แค่บอกว่า เลือก Order ID เป็น Primary Key เพราะเป็น Attribute เพียง Attribute เดียวที่ไม่มีค่าซ้ำเกิดขึ้น)

จำไว้ว่า เราจะเลือก Primary Key จาก Attribute หรือกลุ่มของ Attribute ที่มีจำนวน Attribute น้อยที่สุด ที่สามารถ ระบุ Tuple โดยไม่มีการซ้ำกัน

หมายเหตุ: สำหรับ Candidate Key ที่ไม่ได้เลือกให้เป็น Primary Key เรียกว่า Alternative Key

Foreign key

จุดมุ่งหมายการสร้าง key ก็คือ การเชื่อมโยงกันระหว่างตาราง ถ้าเรามี Primary key ก็ต้องมีตัวเชื่อมสำหรับในอีกตารางหนึ่ง ตรงนี้เราจะเรียกว่า Foreign Key

ถ้าเรามีอีกตารางหนึ่ง ชื่อ Order Details สำหรับแสดงรายละเอียดสินค้า เราจะรู้ได้อย่างไรว่าเป็นสินค้าของ Orders ไหน? โดยเราใช้ Order ID เป็น Primary Key ของตาราง Orders ไปแล้ว

ง่าย ๆ เราใช้ Primary Key ซึ่งก็คือ Order IDs ของตาราง Orders นี่แหละ ไปใส่กำกับไว้ในตาราง Order Details ตามตัวอย่างนี้

แต่ Order ID ในตาราง Order Details จะไม่ได้ทำหน้าที่เป็น primary key แล้ว เพราะมีค่าซ้ำในคอลัมน์ เราจะเรียกมันว่า Foreign Key

Foreign Key จะอ้างอิงค่าจาก Primary Key เสมอ มีหน้าที่เป็นตัวเชื่อมโยงความสัมพันธ์ระหว่างตาราง โดยไม่จำเป็นต้องใช้ชื่อ Attribute เหมือน Primary Key ก็ได้ (แต่ตั้งไว้เหมือนกันก็ดี จะได้รู้ว่าเป็นตัวเดียวกัน และข้อมูลที่ใส่ จะต้องเชื่อมโยงไป primary key ของอีกตารางหนึ่ง

Foreign Key เป็นสิ่งจำเป็นไม่แพ้ Primary Key เพราะมีความเกี่ยวเนื่องกันเต็มที่ ถ้ามีความผิดพลาด เช่น ใน Primary Key มีแค่ 1 – 4 แต่เราใส่ 5 ลงไปใน Foreign Key จะขึ้น error ให้ตรวจสอบ

(เปรียบเทียบเหมือนกรณีเราทำ Vlookup หรือ XLookup ใน Excel นั่นแล มันต้องมี Primary Key สำหรับการเชื่อม)

เรื่อง Key ใน RDBMS นี้เป็นพื้นฐานสำคัญในเรื่อง database ที่เรากำลังจะมาพูดคุยกันในครั้งต่อไป

อ้างอิง Primary and Foreign Key Constraints

ความคิดเห็นของคุณ :)

%d bloggers like this: