On this page
Relational Model & ออกแบบตาราง
เข้าใจตาราง แถว คอลัมน์ key และความสัมพันธ์ — รากฐานของการออกแบบฐานข้อมูลที่ดี
เกือบทุกแอปจริงต้องเก็บข้อมูลถาวรในฐานข้อมูล (database) ชนิดที่นิยมสุดคือ relational database ที่เก็บข้อมูลเป็นตาราง หัวข้อนี้สอนวิธีคิดเรื่องการออกแบบตารางให้ดีตั้งแต่ต้น ก่อนเขียน SQL จริง
ตาราง แถว คอลัมน์ และ key
ข้อมูลเก็บเป็นตาราง แต่ละแถว (row) คือหนึ่งรายการ แต่ละคอลัมน์ (column) คือคุณสมบัติหนึ่ง
| คำ | ความหมาย |
|---|---|
| Table | ตารางเก็บข้อมูลชนิดเดียวกัน (เช่น users) |
| Row | หนึ่งรายการ (ผู้ใช้หนึ่งคน) |
| Column | คุณสมบัติหนึ่ง (name, email) |
| Primary Key | คอลัมน์ที่ระบุแต่ละแถวไม่ซ้ำ (id) |
| Foreign Key | คอลัมน์ที่ชี้ไป primary key ของอีกตาราง |
ตาราง users ตาราง posts
+----+--------+ +----+---------+----------+
| id | name | | id | title | user_id | <- FK ชี้ไป users.id
+----+--------+ +----+---------+----------+
| 1 | Aph | | 1 | Hello | 1 |
| 2 | Bee | | 2 | World | 1 |
+----+--------+ +----+---------+----------+ความสัมพันธ์ระหว่างตาราง
| แบบ | ตัวอย่าง | ทำยังไง |
|---|---|---|
| One-to-Many | ผู้ใช้ 1 คน มีหลายโพสต์ | posts มี FK user_id |
| Many-to-Many | นักเรียน-วิชา (ลงได้หลายวิชา) | ตารางกลาง (enrollment) |
| One-to-One | ผู้ใช้ 1 คน มี 1 profile | FK + unique |
Normalization — อย่าเก็บข้อมูลซ้ำ
หลักการคือไม่เก็บข้อมูลเดียวกันซ้ำหลายที่ เพราะแก้ยากและเสี่ยงไม่ตรงกัน แยกข้อมูลออกเป็นตารางแล้วเชื่อมด้วย key แทน
# ❌ เก็บชื่อผู้ใช้ซ้ำในทุกโพสต์ (แก้ชื่อต้องตามแก้ทุกแถว)
posts: | id | title | user_name |
# ✅ เก็บ user_id ชี้ไปตาราง users (แก้ชื่อที่เดียว)
posts: | id | title | user_id | -> users: | id | name |การวาง schema ให้ดีตั้งแต่แรก (แยกตารางตามชนิดข้อมูล, ตั้ง key ให้ถูก) ช่วยลดปัญหามหาศาลในอนาคต — เปลี่ยน schema ของระบบที่มีข้อมูลแล้วยุ่งยากกว่าเขียนโค้ดมาก
สรุปหัวข้อนี้
- ข้อมูลเก็บเป็นตาราง: row (รายการ) × column (คุณสมบัติ)
- Primary Key ระบุแถวไม่ซ้ำ; Foreign Key เชื่อมไปตารางอื่น
- ความสัมพันธ์: 1-many (FK), many-many (ตารางกลาง), 1-1
- Normalization: อย่าเก็บซ้ำ แยกตาราง+เชื่อมด้วย key
1) ออกแบบ schema ระบบยืม-คืนหนังสือ (members, books, loans) 2) ระบุ primary key และ foreign key ของแต่ละตาราง 3) ระบุว่าความสัมพันธ์ member-loan เป็นแบบไหน 4) ชี้จุดที่ออกแบบผิดถ้าเก็บชื่อสมาชิกซ้ำในตาราง loans