簡體   English   中英

第一范式的外鍵?

[英]Foreign keys in first normal form?

我有一個蛋白質棒的數據庫。 這是我憑直覺得出的結論:

在此處輸入圖片說明



但我也想通過逐步規范化得出一個結論: 在此處輸入圖片說明

深灰色背景代表重復組。

題:
在將表拆分為多個新表的最后一步中,是否添加外鍵? 還是在 2NF 中向新表添加外鍵?

該產品的原型可以在proteinbarinfo.com上找到

任何時候創建依賴表都會添加外鍵約束 這可能發生在規范化的任何階段。

為了規范化,不需要向所有查找表添加數字偽鍵 ( id )。 您可以將字符串作為主鍵,也可以滿足普通形式。

當您具有多對多關系(例如 ProteinBars 和 Verified 類別之間)時,使用復合鍵在兩者之間創建表是合適的。

前三種范式有一個助記符:表中的每一列都必須依賴於鍵、整個鍵,並且只依賴於鍵。

ProteinBar_has_Aroma具有復合鍵且沒有其他屬性的表隱式滿足所有三個條件:

  1. 由於兩列都是主鍵的成員,因此它們必須依賴於主鍵。 也就是說,對於給定的主鍵(即一對特定值),您顯然可以同時獲得蛋白質條和香氣屬性。

  2. 整個鍵 - 您需要整個主鍵才能找到給定的行,因此該表中的兩列都依賴於整個主鍵。

  3. 除了鍵之外什么都沒有 - 沒有任何其他(非鍵)屬性列可供選擇,因此除了鍵之外它們不能依賴任何東西。

在完成分解為所需的最高 NF(標准形式)后,我們確定 FK。 (請注意,分解為目標 NF 並不意味着我們要經過較低的 NF。我們使用適當的算法。)

每個二進制無損分解都會引入至少一個從一個組件到另一個組件的 FK(外鍵)。 (從任何 NF 到任何 NF。無論任何組件的 NF 是否高於或低於原始或其他組件。)

(為什么?組件是原始的投影,因此它們具有與每列中相同的值。此外(根據基本的歸一化定理)當/如果組件的公共列是一個的超集時,二元分解是無損的其中一個表的 CK(候選鍵)。所以至少有一個從一個組件到另一個 CK 的 FK。可能有更多的 FK。)

但是,如果我們繼續進行更多分解以僅獲得目標 NF 中的組件,那么這兩個組件不會同時包含在最終設計中,因此它們之間也不會包含任何 FK。

此外,一些無損分解不能通過二進制分解的組合來表達,並且可能不會引入 FK。 (同樣,無論模式的 NF 是多少。)這些是標准化到 4NF 以上的分解。 (與常見的關於 5NF 的聲明相反,這些是重要的理想分解,並且不經常需要它們的唯一原因是違規的設計大多明顯很糟糕,以至於我們不考慮它們。)

所以我們必須確定最終設計的 FK 和其他約束。 (如果最后一次分解是二進制的,那么至少會有一個 FK。)

PS 對更高 NF 的規范化不會引入新的列名,尤其是 id。 它將關系模式替換為其他具有連接回它的列的適當子集的關系模式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM