Back to: SQL For Data Analyst
ฐานข้อมูลเชิงสัมพันธ์ (Relational Database) คืออะไร
ตอนที่แล้วเรารู้จัก SQL แบบผิวเผินแล้ว ตอนนี้เราจะเจาะลึกไปที่ “บ้าน” ของ SQL นั่นคือฐานข้อมูลเชิงสัมพันธ์ ว่าทำไมข้อมูลถึงถูกเก็บเป็นตาราง และตารางแต่ละใบสัมพันธ์กันยังไง
ฐานข้อมูลเชิงสัมพันธ์ คืออะไร
ฐานข้อมูลเชิงสัมพันธ์ (Relational Database) คือฐานข้อมูลที่เก็บข้อมูลในรูปแบบ “ตาราง” (table) หลาย ๆ ใบ โดยแต่ละตารางเก็บข้อมูลเรื่องใดเรื่องหนึ่งโดยเฉพาะ แล้วตารางเหล่านั้นก็ “สัมพันธ์” กันผ่านคอลัมน์ที่เชื่อมโยงกันได้
ลองนึกภาพร้านค้าออนไลน์ร้านหนึ่ง แทนที่จะเก็บทุกอย่างไว้ในตารางเดียวยาวเป็นพรืด เขาจะแยกเป็นตารางย่อยตามหัวข้อ เช่น
customers— เก็บข้อมูลลูกค้า (ชื่อ, อีเมล, วันที่สมัคร)orders— เก็บข้อมูลคำสั่งซื้อ (วันที่สั่ง, ลูกค้าคนไหนสั่ง, ยอดรวม)products— เก็บข้อมูลสินค้า (ชื่อสินค้า, ราคา, หมวดหมู่)
แต่ละตารางแยกเรื่องกันชัดเจน แล้วเชื่อมกันด้วย “กุญแจ” ที่บอกว่าออเดอร์นี้เป็นของลูกค้าคนไหน ซึ่งเราจะเรียกกุญแจนี้ว่า Key (จะเจาะลึกเรื่อง Primary Key และ Foreign Key ต่อในบทที่ 4 เรื่อง JOIN)
ทำไมต้องแยกเป็นหลายตาราง
คำถามที่มือใหม่มักสงสัยคือ “ทำไมไม่รวมทุกอย่างไว้ในตารางเดียวไปเลย จะได้ไม่ต้องเชื่อมให้ยุ่งยาก” คำตอบคือ ถ้ารวมทุกอย่างไว้ตารางเดียว จะเกิดปัญหาข้อมูลซ้ำซ้อนมหาศาล เช่น ถ้าลูกค้าคนหนึ่งสั่งซื้อ 50 ครั้ง ก็ต้องพิมพ์ชื่อ อีเมล ที่อยู่ของลูกค้าคนนั้นซ้ำถึง 50 แถว ทำให้:
- ไฟล์ข้อมูลใหญ่โตเกินจำเป็น
- ถ้าลูกค้าเปลี่ยนอีเมล ต้องไปแก้ทีละ 50 แถว เสี่ยงตกหล่น
- ข้อมูลไม่สอดคล้องกัน (แถวหนึ่งอีเมลเก่า อีกแถวอีเมลใหม่)
การแยกตารางแล้วเชื่อมด้วย Key จึงช่วยให้ข้อมูลแต่ละเรื่อง ถูกเก็บแค่ที่เดียว และอัปเดตง่าย ถูกต้อง สอดคล้องกันเสมอ
-- ตาราง customers customer_id | name | email ------------|-------|------------------ 1 | Nisa | nisa@mail.com 2 | Ton | ton@mail.com -- ตาราง orders (เชื่อมกับ customers ผ่าน customer_id) order_id | customer_id | total ---------|-------------|------- 101 | 1 | 590 102 | 1 | 1200 103 | 2 | 350
สังเกตว่าตาราง orders ไม่ได้เก็บชื่อหรืออีเมลลูกค้าซ้ำอีก แต่เก็บแค่ customer_id ไว้ “อ้างอิง” กลับไปที่ตาราง customers เท่านั้น เวลาอยากรู้ว่าออเดอร์ 101 เป็นของใคร เราค่อยใช้ SQL เชื่อมสองตารางนี้เข้าด้วยกัน (เดี๋ยวเราจะเรียนคำสั่งนี้แบบเต็ม ๆ ในบทที่ 4)
ทำไม SQL ถึงเหมาะกับข้อมูลแบบนี้
SQL ถูกออกแบบมาตั้งแต่ต้นให้ทำงานกับข้อมูลรูปแบบตารางที่สัมพันธ์กันแบบนี้โดยเฉพาะ คำสั่งอย่าง JOIN ที่เราจะเรียนในบทที่ 4 ก็คือเครื่องมือหลักที่ใช้ “เชื่อม” ตารางเหล่านี้เข้าด้วยกันตอนดึงข้อมูลออกมาดู นี่คือเหตุผลที่แทบทุกระบบฐานข้อมูลในโลกธุรกิจ ไม่ว่าจะเป็น PostgreSQL, MySQL, BigQuery, Snowflake ล้วนใช้ SQL เป็นภาษาหลักในการสื่อสาร
สรุปตอนนี้
- ฐานข้อมูลเชิงสัมพันธ์เก็บข้อมูลเป็นตารางหลายใบ แยกตามหัวข้อ
- ตารางเชื่อมกันด้วย Key (จะเรียนละเอียดในบทที่ 4 เรื่อง JOIN)
- การแยกตารางช่วยลดข้อมูลซ้ำซ้อนและทำให้ข้อมูลสอดคล้องกัน
- ตอนถัดไป: มาทำความรู้จัก Table, Row, Column และ Schema กันแบบละเอียดขึ้น
ลองมือทำจริง
ยังไม่ต้องรันจริงก็ได้ครับ ลองตอบตามความเข้าใจ แล้วกด “ดูเฉลย” เพื่อเช็กว่าคิดถูกทางไหม
1. ถ้าคุณจะออกแบบฐานข้อมูลสำหรับร้านหนังสือออนไลน์ ลองเขียนชื่อตารางที่ควรมีอย่างน้อย 3 ตาราง พร้อมบอกสั้น ๆ ว่าแต่ละตารางเก็บอะไร
แนวคำตอบ
customers → ข้อมูลลูกค้า (ชื่อ, อีเมล) books → ข้อมูลหนังสือ (ชื่อเรื่อง, ราคา, ผู้แต่ง) orders → ข้อมูลคำสั่งซื้อ (ลูกค้าคนไหนซื้อ, ซื้ออะไร, เมื่อไหร่)
คำตอบไม่ตายตัวครับ ขอแค่แยกข้อมูลตามหัวข้อชัดเจน และไม่เก็บข้อมูลคนละเรื่องปนกันในตารางเดียว ก็ถือว่ามาถูกทางแล้ว
2. ทำไมการแยกข้อมูลลูกค้าออกจากตาราง orders ถึงช่วยลดปัญหาได้ ลองอธิบายด้วยคำพูดตัวเอง
แนวคำตอบ
ถ้าไม่แยก ทุกครั้งที่ลูกค้าสั่งซื้อ ระบบต้องพิมพ์ชื่อ/อีเมลซ้ำทุกแถว ทำให้ไฟล์ใหญ่ขึ้นโดยไม่จำเป็น และถ้าลูกค้าเปลี่ยนอีเมล ต้องไปแก้หลายแถว เสี่ยงข้อมูลไม่ตรงกัน การแยกตารางแล้วอ้างอิงด้วย customer_id ทำให้แก้ที่เดียวจบ และข้อมูลสอดคล้องกันเสมอ