大家好,我是Josh,我才沒想到才發布一天就停更。廢話不多說馬上進入主題!
今天要介紹什麼是關聯模型,這個詞很多人聽過但一知半解,只知道跟SQL有關但就沒有然後了,所以今天會盡量以簡單易懂的方式,讓大家能快速了解關聯模型。
一、關聯模型(Relational Model)
二、資料表(Table)、資料行(Column)、資料列(Row)
三、主索引鍵(Primary Key)
四、外部索引鍵(Foreign Key)
Relational Model簡單來說他是基於Set Theory發展出來的,該模型描述如何在Database上的資料表(Table)執行常見的運算,如聯集跟交集,這會對應到以後談到的Right Join, Inner Join等。這些細講下去會有些偏題,比較不是Programmer需要知道的,有興趣的可以看References裡的資訊。
如果這太複雜的話,更簡單粗暴的說,Relational Model把整個Database裡的Table都當成類似Excel表格的方式存放,只是比較艱深的詞彙描述怎麼存Excel。如果會使用Excel,日後在建置設計Table的時候也會有所幫助。
二、資料表(Table)、資料行(Column)、資料列(Row)
想必光看到圖大家已經有些感覺。在SQL Table中,直的是Column,橫的是Row。SQL中第一個Row都會是存放各個Column的類別名稱,Table中每個名詞幾乎都有不同說法,圖中大字是最常見,小字是也會聽到但頻率低一些。一開始看過就好不用記,久了會習慣這些名詞交替出現。
學SQL跟資料庫,不可以不知道Primary Key是什麼。Primary Key是用來讓Table,透過「唯一的」名稱來識別Row用的,但Row本身並沒有名字,除了知道他是第幾個以外,沒有好的稱呼方式。因此,Primary Key就派上用場,Primary Key就相當於每個Row的名字。
例如以下的Student Table:
Student_Id | Name | Department |
---|---|---|
0001 | Josh | Data Science |
0002 | Ruby | Social Work |
0003 | Anita | Finance |
0004 | Judy | Computer Science |
在這個例子中,雖然每個人的姓名是獨立的,但難保不會遇到整個學校裡,有人剛好撞名,且一般在SQL中,大家更傾向尋找具有順序性的欄位當Primary Key。因此在這個例子中,學號是更適合的選擇,有不容易修改、具唯一等性質。有一點直得注意,你可以發現一般Table的Primary Key偏好放在最左邊,這是SQL寫作上的風格(Convention)
在聽完以上的介紹後,應該更好想像,為什麼Primary Key會有這些特性:
在進入Foreign Key以前,先來做個小測驗,確認自己是否真的理解Primary Key。答案在最底下
Ex1: 根據以上的Student Table,請問下列何者可以有效的新增Row至Table?
(A) 0001, Chris, Computer Science
(B) NULL, Dave, Economics
(C) 0005, Jerry, Accounting
Foreign Key我想先從例子講起,假設除了剛剛的Student Table稍作修改外,我還有一個表格叫Department Table存放跟科系相關的資料。
Student Table:
Student_Id | Name | Department | Department_Id |
---|---|---|---|
0001 | Josh | Data Science | D03 |
0002 | Ruby | Social Work | D02 |
0003 | Anita | Finance | D04 |
0004 | Judy | Computer Science | D01 |
Department Table:
Department_Id | Department | Number_Of_Student |
---|---|---|
D01 | Computer Science | 70 |
D02 | Social Work | 69 |
D03 | Data Science | 57 |
D03 | Finance | 59 |
假設我想知道Josh系上有多少人(Number_Of_Student)該怎麼辦?
關於這個問題,就需要用到範例中的"Foreign Key",首先要先知道Josh讀Data Science,但更好的是用旁邊的Department_Id。再用Department_Id找到Data Science的Number_Of_Student=57。在這個範例中,Student Table的Foreign Key就是Department_Id,可以用來連結其他Tables。
我終於要來解釋他的定義了,
A foreign key (FK) is a column or combination of columns that is used to establish and enforce a link between the data in two tables to control the data that can be stored in the foreign key table. - SQL Server, Microsoft
我來換句話說的話,FK可以是一個Column或多個Column的組合(這點與Primary Key類似),達成可與其他Table連接的效果,而Foreign Key會是某個Table的"Primary Key"。但Foreign Key特別的是,它可以是Null。
解答:(C)
References:
Book: 學習SQL的15堂課/Chris Fehily
Primary and Foreign Key: https://www.scholarhat.com/tutorial/sqlserver/different-types-of-sql-keys
Images and SQL Table: https://www.datawithbaraa.com/sql-introduction/sql-tables/
Relational Model: https://en.wikipedia.org/wiki/Relational_model
Different Types of SQL keys: https://www.scholarhat.com/tutorial/sqlserver/different-types-of-sql-keys