關係型資料庫的主鍵和外鍵

弘毅供應鏈 發佈 2023-06-12T21:02:34.957333+00:00

在之前的文章中,我介紹了關係型資料庫中的關係、基數、實體關係圖、鴉爪圖和業務規則等概念,這篇文章會繼續討論資料庫的另一個重要的概念「鍵」。理解這部分的內容後,我們對數據索引的認識會上升到一個新高度。1.什麼是「鍵」?在解釋概念之前,讓我們先回顧一下此前的內容。

在之前的文章中,我介紹了關係型資料庫中的關係、基數、實體關係圖、鴉爪圖和業務規則等概念,這篇文章會繼續討論資料庫的另一個重要的概念「鍵」。理解這部分的內容後,我們對數據索引的認識會上升到一個新高度。

1.什麼是「鍵」?

在解釋概念之前,讓我們先回顧一下此前的內容。

圖 「SKU」、「供應商」、「採購訂單」實體關係圖

首先我們看「SKU」和「供應商」的關係,簡單來說,這是「一對多」的關係,如果用更加嚴謹的表達,那就是「0或1個」SKU,是由」0或多個「供應商來供貨的。

這個關係的意思是SKU可能有多個供貨商,也可能暫時沒有貨源。反過來,供應商最多只能提供某一個的SKU,或是不供應。

其次是「供應商」和「採購訂單」的關係,一個供應商可以對應著「0或多個」的採購訂單,而一個採購訂單只能對著「1個,且僅有1個」的供應商。這些關係的具體內容都在前篇文章中已介紹過,不再重複。

什麼是「鍵」呢?它是從英文「Keys」翻譯過來的,在資料庫中討論的鍵主要有2種,分別是主鍵(Primary Keys,縮寫PK)和外鍵(Foreign Keys,縮寫FK)。

2.主鍵

主鍵就是主要的鍵,它是一個或多個屬性,可用於識別某個實體或表中唯一的記錄。定義很抽象,讓我們來舉個例子。

圖 「SKU」表格

在SKU實體中的屬性有件號、供應商編號、供應商名稱和配額。在表格中有4條記錄,哪個屬性可以識別出唯一的記錄呢?很顯然是件號,其他的屬性都可能會有重複的記錄,然而件號是根據一定的規則編制的,且不會重複。

主鍵是身份標識號,就像是人的身份證一樣。全中國同名同姓的人可能有很多,不能作為主鍵,身份證號碼是唯一的,它就可以是主鍵。

在資料庫中,主鍵是自動生成的號碼,按照順序,從小到大的整數,例如「26303」。每次新增一條記錄,主鍵的號碼就自動增加1位。使用整數的好處是占用存儲空間小,成本更低,而且查詢的速度也更快。

由於主鍵是唯一的,我們在嘗試添加一條新的數據之前,資料庫會檢查是否有重複的條目。因此,主鍵是一個對特定表中的每一條記錄都是唯一的值。

在「供應商」實體中,哪一個屬性是主鍵呢?可能有人會說是「供應商編號」,它看起來符合成為主鍵的條件。但是供應商表格里可能存在重複的供應商編號,所以僅憑一個屬性是不能成為主鍵,我們需要把多個屬性組合在一起後,它們才能變成唯一的值。

舉個例子,高鐵上有多個車廂,每個車廂里都有1A這個座位,我該如何對號入住呢?就需要結合車廂號和座位號,才能找到該趟車上正確的位置,例如03車1A座,這是唯一的記錄。在供應商表中,屬性「供應商編號」和「序號」組合在一起,它們構成了該實體中的主鍵,也叫做複合鍵(Composite Keys)。

圖 複合鍵

3.外鍵

顧名思義,「外鍵」就是外來的鍵。在介紹概念之前,讀者可能已經觀察到了,有些實體的主鍵會出現在其他的實體之中,例如「SKU」中的「件號」也存在於「供應商」實體裡。「件號」在前者的表格里是主鍵,那麼它在其他表中的作用是什麼呢?

SKU和供應商實體是一對多的關係,每個SKU可以有多個的供應商供貨,而供應商只能供應某一個特定的SKU。在這種情況下,SKU是獨立的或叫做父級實體,而供應商是相關的或叫做子級實體。

「件號」在SKU表中是主鍵,它在相關的子級表中就是外鍵。外鍵是另一個表中的主鍵,用於連接從屬關係與父級實體。

圖 主鍵和外鍵的關係

在上圖的例子中,父實體是SKU,它的主鍵是件號。子實體是供應商表,其外鍵是存儲在供應商表中的件號。這樣做是有什麼意義呢?每一個SKU,例如件號是26516,蘇州X公司和常熟Y公司都可以供貨。

因此,每個供應商都有自己的供應商編號和序號,蘇州X公司的編號是1475,序號是6,常熟Y公司的編號是1369,序號是5,但他們兩家的件號的值都是26516,這是供應商表中的外鍵。

件號是SKU表的主鍵,它是一個唯一的值,可以識別SKU表中的每一行。然後在供應商表中,主鍵是供應商編號和序號,但每個供應商也有一個件號,它是一個有效的值,來自這個SKU表。

重要的一點是,供應商編號和序號是供應商的唯一標識符。件號不需要作為供應商主鍵的一部分,因為這個表已經有一個完整的唯一識別主鍵。這只是一個額外的支持信息,幫助我們在這兩個表之間建立數據關係。

總結一下,主鍵是幫助我們唯一地識別表中的每一條記錄的屬性。所以它們對每一條記錄都必須是唯一的,只要我們有了這個鍵,就能幫助我們找到一行中的所有附加信息。

外鍵是存儲在從屬實體中的屬性,它向我們展示了從屬實體中的記錄是如何與獨立實體相關的。所以,外鍵是另一個表的主鍵,而這個表是子表或從屬實體。

關鍵字: