「筆記」- 資料關聯的三種關係

Pierce Shih
皮爾斯的自學旅程
5 min readJun 5, 2019

程式海無涯,聽說永遠學不完,那我只好一點一點把它們寫下來囉!

在上篇文章,我們聊到何謂資料庫系統,有提到在關聯式資料庫裡,資料之間必須有明確的「關聯」,而本篇文章將著重在介紹更多「關聯」的內容。

資料關聯的三種關係

1. 一對一的關係(One to One)

如電商網站,一個會員只會擁有一個購物車,而每個購物車也只會對應到一個會員。

一對一的資料關聯

2. 一對多的關係(One to Many)

如電商網站,一個分類通常會包含許多樣的商品,而一個商品只會對應到一個分類。

一對多的資料關聯

3. 多對多的關係(Many to Many):

如運動比賽,一場賽事可以開放給很多人觀賞,但這些人也可以同時觀賞其他活動。

多對多的資料關聯

如何辨識資料之間的關係

資料的關係會根據應用程式的需求而不同,那要如何辨識關係的種類呢?

最基本的思考方式,是詢問在目前應用程式需求的情境下:

資料 A 是否有多筆資料 B? 資料 B 是否有多筆資料 A?

・如果兩個問題都是 No,代表資料 A 和 B 是一對一的關係。

・如果其中一個是 No,而另一個是 Yes,那麼就是一對多的關係(看哪個資料是多的那方)。

・如果兩個問題都是 Yes,那麼就是多對多的關係。

圖片引用來源:Unsplash

如何使用主鍵和外鍵建立資料的關係

何謂主鍵(Primary key)

主鍵(Primary key)功能是代表一筆資料表中的一筆資料需要具備「唯一性」和「持有性」的屬性,而每個資料表都必須要有一個主鍵的欄位。

唯一性是指該屬性必須是獨一無二的值,不可重複出現,以學校來說,能代表一個學生唯一值的可以是「學生證號碼」、「信箱』、「駕照號碼」。

不過即便資料具有唯一性,仍需考量是否具備持有性,主要是每個人不一定都會有「駕照號碼」,因此,該屬性無法作為主鍵,這就是所謂的持有性。

何謂外鍵(Foreign Key)

外鍵(Foreign Key)功能是用來建立不同資料之間的關係,而外鍵一定是其他資料表的主鍵,因此,外鍵的取名相當重要,要讓人有效判讀,才能辨識和另一個資料表的關係。

圖片引用來源:Unsplash

實際演練

如同前面所提,資料之間共有三種關係,分別是一對一、一對多和多對多的關係,因此,要建立不同的關係,過程上會有些許的不同。

注意: table 的命名名稱通常會是複數並且全部小寫,例如 users、todos。

一對一的關係(One to One)

在一對一的關係裡,我們可以把任一 table 的 Primary Key 放入另一個 table 當 Foreign Key。

例如:使用者(User)和購物車(Cart)是一對一的關係,有兩種做法:

作法(ㄧ):在 carts table 增加一個 user_id 屬性作為 Foreign Key ,對應到 users table 的 id 屬性。

圖示:一對一的關係之作法一

作法(二):在 users table 增加一個 cart_id 屬性作為 Foreign Key ,對應到 carts table 的 id 屬性。

圖示:一對一的關係之作法二

一對多的關係(One to Many)

在一對多的關係裡,我們要在「多」的那方 table 上新增 Foreign Key,對應到「一」那邊的 Primary Key。

例如:一個分類(Category)會有多個商品(Product),也就是說要在 products table 上加入一個 category_id 屬性作為外鍵(Foreign Key)使用。

圖示:一對多的關係

多對多的關係(Many to Many)

多對多的關係可以用兩個一對多的關係來辨識,如:

  • 一個 A 是否會有多個 B?
  • 一個 B 是否會有多個 A?

若兩者皆成立,代表兩者是多對多關係,因此,要在原本的兩個 table 之間,加上一個新的 Table,連結另外兩個 table 成為一對多關係的 table。

例如:使用者(User)和運動賽事(Game)是多對多的關係。

透過新增一個 activities table 作為連結點,讓它與 users table 和 games table 分別成為一對多的關係。

同時, 不僅users table id 作為 activities table 的外鍵,對應到 users table 的 id 屬性,另外,games table id 也作為 activities table 的外鍵,對應到 games table 的 id 屬性。

圖示:多對多的關係
謝謝你的閱讀!如果有任何想法,也歡迎留言與我分享~如果願意給我一些小小鼓勵,請給我 1–20 個拍手;
如果覺得文章對你有點幫助,請給我 21-30 個拍手;
如果非常喜歡我的技術筆記,請長按拍手按鈕(50個拍好拍滿)讓我知道哦 👏🏻最後,若希望持續追蹤我的最新文章,別忘了追蹤 皮爾斯的自學旅程 唷,乾溫 :D

--

--

Pierce Shih
皮爾斯的自學旅程

Leading business growth with product mindset and technical perspective