昨天講了後端和前端的橋樑API,今天就來講講後端的資料語言吧!
SQL(Structured Query Language,結構化查詢語言)
是一種專門用來操作關聯式資料庫的語言
常見的 CRUD(Create、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 | |
---|---|---|
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
,就建立了一個「關聯」。
代表:
這樣的設計可以避免重複資料(不用每張訂單都再寫一次名字和 email),也讓資料結構更清晰
而在資料庫設計上正規化也是很重要的一個概念
它的目的是:
這裡有一張還沒經過正規化的表
Student 表
id | name | courses | teacher |
---|---|---|---|
1 | Amy | 數學, 英文, 物理 | 王老師, 李老師 |
2 | Bob | 數學, 化學 | 王老師, 陳老師 |
這張Student表有什麼問題:
資料重複 (Redundancy)
courses
欄位裡重複出現courses
去改,超麻煩資料不一致 (Inconsistency)
courses
寫成「數學, 英文」,Bob 的 courses
寫成「英文, 數學」排列組合爆炸
第一正規化 (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/