Skip to content

🔗 Relationships (ความสัมพันธ์)

หัวใจสำคัญของ Relational Database คือการเชื่อมโยงข้อมูลระหว่างตารางเข้าด้วยกัน เพื่อลดความซ้ำซ้อนและทำให้ข้อมูลมีความหมายมากขึ้น


🔑 Key Concepts

ก่อนจะไปดูประเภทความสัมพันธ์ ต้องรู้จัก 2 ตัวละครหลัก:

  1. Primary Key (PK): กุญแจหลักที่ระบุตัวตนของข้อมูลในตารางตัวเอง (เช่น id ของ user)
  2. 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()