iT邦幫忙

2025 iThome 鐵人賽

DAY 19
0
Modern Web

30天一起搞懂Web觀念系列 第 19

[DAY19] 什麼是 SQL?什麼是關聯?

  • 分享至 

  • xImage
  •  

昨天講了後端和前端的橋樑API,今天就來講講後端的資料語言吧!

SQL 是什麼?

SQL(Structured Query Language,結構化查詢語言)

是一種專門用來操作關聯式資料庫的語言

常見的 CRUDCreate、Read、Update、Delete) 四大操作:

  • 查詢 (SELECT)

    從資料庫拿資料

    SELECT * FROM users WHERE age > 18;
    

    → 找出所有年齡大於 18 歲的使用者

  • 新增 (INSERT)

    新增一筆資料

    INSERT INTO users (name, email) VALUES ('Joanne', 'test@example.com');
    
  • 更新 (UPDATE)

    修改現有資料

    UPDATE users SET email = 'new@example.com' WHERE id = 123;
    
  • 刪除 (DELETE)

    刪除一筆資料

    DELETE FROM users WHERE id = 123;
    

關聯是什麼?

大部分的資料庫(例如 MySQL、PostgreSQL、SQLite)都是關聯式資料庫 (Relational Database)

「關聯」指的是:不同的資料表 (Table) 之間可以有關係

舉例來說:

假設我們有兩張表:

使用者表 (users)

id name email
1 Amy amy@test.com
2 Bob bob@test.com

訂單表 (orders)

id user_id product
1 1 iPhone
2 2 iPad
3 1 MacBook

這裡 orders.user_id 對應到 users.id,就建立了一個「關聯」。

代表:

  • Amy 買了 iPhone、MacBook
  • Bob 買了 iPad

這樣的設計可以避免重複資料(不用每張訂單都再寫一次名字和 email),也讓資料結構更清晰


而在資料庫設計上正規化也是很重要的一個概念

正規化(Normalization)

它的目的是:

  • 避免資料重複
  • 確保一致性
  • 提高查詢效率

這裡有一張還沒經過正規化的表

Student

id name courses teacher
1 Amy 數學, 英文, 物理 王老師, 李老師
2 Bob 數學, 化學 王老師, 陳老師

這張Student表有什麼問題:

  • 資料重複 (Redundancy)

    • 「數學」會在 Amy 和 Bob 的 courses 欄位裡重複出現
    • 如果未來要改「數學」的名稱(改成「數學A」),就要到每一筆 courses 去改,超麻煩
  • 資料不一致 (Inconsistency)

    • 假設 Amy 的 courses 寫成「數學, 英文」,Bob 的 courses 寫成「英文, 數學」
    • 其實修的課一樣,但因為是字串,結果資料不一致
  • 排列組合爆炸

    • 理論上課程就只有 4 種固定的資源(數學、英文、物理、化學)
    • 但是因為把它們硬塞進同一個欄位,會變成很多「排列組合」:
      • 「數學, 英文」
      • 「英文, 數學」
      • 「數學, 化學」
      • 「化學, 數學」
      • ……
    • 所以一個應該只需要「4 筆紀錄」的課程資料,會被搞成可能有64種以上的排列方式,失去一致性
  • 第一正規化 (1NF)

    每個欄位只存一個值,不能出現「陣列」或「重複欄位」

course有很多內容,我們把course表拆出來自己一個StudentCourses

StudentCourses

id student_id course teacher
1 1 數學 王老師
2 1 英文 李老師
3 1 物理 李老師
4 2 數學 王老師
5 2 化學 陳老師
  • 第二正規化 (2NF)

    非主鍵的欄位要完全依賴主鍵

StudentCourses表中,teacher 其實跟 course 有關,而不是跟 student_id 有關,所以要拆開

Students

id name
1 Alice
2 Bob

Courses

id name teacher
1 數學 王老師
2 英文 李老師
3 物理 李老師
4 化學 陳老師

StudentCourses(關聯表)

student_id course_id
1 1
1 2
1 3
2 1
2 4
  • 第三正規化 (3NF)

    消除間接依賴

    假設老師有「辦公室」資訊,如果我們把「辦公室」放在 Courses 表,會出現重複(因為一個老師可能教多門課)

Teachers

id name office
1 王老師 A101
2 李老師 B202
3 陳老師 C303

Courses

id name teacher_id
1 數學 1
2 英文 2
3 物理 2
4 化學 3

最後完成

  • Students → 學生名單
  • Teachers → 老師名單
  • Courses → 課程,對應老師
  • StudentCourses → 學生和課程的關聯

當然有SQL就有NoSQL,明天就來講NoSQL吧~


參考資料

https://ithelp.ithome.com.tw/articles/10229472

https://aws.amazon.com/tw/compare/the-difference-between-relational-and-non-relational-databases/


上一篇
[DAY18] API是什麼?
下一篇
[DAY20] NoSQL 是什麼?
系列文
30天一起搞懂Web觀念30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言