Appearance
🔗 Relationships (ความสัมพันธ์)
หัวใจสำคัญของ Relational Database คือการเชื่อมโยงข้อมูลระหว่างตารางเข้าด้วยกัน เพื่อลดความซ้ำซ้อนและทำให้ข้อมูลมีความหมายมากขึ้น
🔑 Key Concepts
ก่อนจะไปดูประเภทความสัมพันธ์ ต้องรู้จัก 2 ตัวละครหลัก:
- Primary Key (PK): กุญแจหลักที่ระบุตัวตนของข้อมูลในตารางตัวเอง (เช่น
idของ user) - Foreign Key (FK): กุญแจต่องที่ชี้ไปยัง PK ของตารางอื่น (เช่น
user_idในตาราง orders)
1. One-to-One (1:1)
หนึ่งต่อหนึ่ง - ข้อมูลหนึ่งอย่างในตาราง A คู่กับข้อมูลหนึ่งอย่างในตาราง B ได้แค่ 1 รายการเท่านั้น
ตัวอย่าง: User กับ UserProfile
- User 1 คน มี Profile ได้แค่ 1 อัน
- Profile 1 อัน เป็นของ User ได้แค่ 1 คน
การออกแบบ:
- ตาราง
users:id,name,email - ตาราง
user_profiles:id,user_id(FK, Unique),address,phone
เมื่อไหร่ควรใช้ 1:1?
มักใช้เมื่อต้องการแยกข้อมูลส่วนที่ไม่ค่อยได้ใช้ หรือเป็นความลับ (เช่น เงินเดือน, เลขบัตรประชาชน) ออกจากตารางหลัก เพื่อประสิทธิภาพและความปลอดภัย
2. One-to-Many (1:N) (พบบ่อยที่สุด)
หนึ่งต่อกลุ่ม - ข้อมูลหนึ่งอย่างในตาราง A คู่กับข้อมูลหลายอย่างในตาราง B
ตัวอย่าง: User กับ Posts
- User 1 คน เขียน Post ได้หลายอัน
- Post 1 อัน เป็นของ User ได้แค่คนเดียว
การออกแบบ:
- ตาราง
users:id,name - ตาราง
posts:id,user_id(FK),title,content
ข้อสังเกต: Foreign Key (user_id) จะอยู่ที่ฝั่ง "Many" (Posts) เสมอ
3. Many-to-Many (N:M)
กลุ่มต่อกลุ่ม - ข้อมูลหลายอย่างในตาราง A คู่กับข้อมูลหลายอย่างในตาราง B
ตัวอย่าง: Students กับ Subjects
- นักเรียน 1 คน ลงเรียนได้หลายวิชา
- วิชา 1 วิชา มีนักเรียนลงเรียนได้หลายคน
การออกแบบ: ต้องมี "ตารางกลาง" (Pivot Table/Junction Table) เสมอ!
- ตาราง
students:id,name - ตาราง
subjects:id,title - ตารางกลาง
student_subject:student_id(FK),subject_id(FK)
🧩 การ JOIN ตารางใน SQL
เมื่อต้องการดึงข้อมูลจากหลายตารางพร้อมกัน เราจะใช้คำสั่ง JOIN
INNER JOIN (ค่าเริ่มต้น)
ดึงเฉพาะข้อมูลที่มีคู่กันทั้งสองตาราง (ถ้า User ไม่มี Post ก็จะไม่ติดมา)
sql
SELECT users.name, posts.title
FROM users
INNER JOIN posts ON users.id = posts.user_id;LEFT JOIN (พบบ่อยกว่า)
ดึงข้อมูลจากตารางซ้าย (Main) มาทั้งหมด แม้จะไม่มีคู่ในตารางขวา (ถ้า User ไม่มี Post ก็จะติดมาด้วย แต่ title จะเป็น NULL)
sql
SELECT users.name, posts.title
FROM users
LEFT JOIN posts ON users.id = posts.user_id;INFO
ใน Laravel เราแทบไม่ต้องเขียน JOIN เอง เพราะ Eloquent จัดการให้ผ่าน method with() เช่น User::with('posts')->get()