Database-Design

需要復合外鍵的複合主鍵的方法

  • February 24, 2019

這是一個名為 Make 的表(namePK 在哪裡)

name|other columns
----------------------
 A | ...
 B | ...
 C | ...

還有一個名為 Type 的表(其中make, namePK 和make引用Make.name為 FK)

make|name|other columns
------------------------
 A |SUV | ...
 B |SUV | ...
 B |UTE | ...
 C |UTE | ...

最後是一個名為 Model 的表(其中make, type, name一起是 PK 和作為 FK的make, type引用)Type.make, Type.name

make|type|name|other columns
-----------------------
 A |SUV |CRV | ...
 A |SUV |HRV | ...
 B |UTE |DMAX| ...

在我看來,表中的Model.make是多餘的Model,但它只是因為Type表使用複合鍵是必要的make, name

擺脫這種冗餘的方法是什麼?

我相信我可以在表中添加一個唯一idType,以便Model表可以將其作為 FK 引用。但似乎這個額外的列只是另一種形式的冗餘,因為make, name已經可以唯一地標識每一行了嗎?

不久前,當我有同樣的確切問題時,我做了這個比較

不久前,當我有一個類似的問題時,我編譯了這個比較。我希望它有幫助!

沒有業務意義的 BIGINT 類型的代理鍵是唯一滿足作為主鍵的所有技術要求的鍵:適用、唯一、穩定和最小化。複合鍵是備用候選鍵。由於上面列出的原因,它可能會提供性能優勢,但它肯定是不穩定的。

兩種設計都是可能的、合理的和非冗餘的(從某種意義上說,在一個解決方案中沒有任何數據可以在不失去資訊的情況下消除):1)將 Type 的 PK 作為對(make、name)並將其用作外部鍵入 Model,或在 Type 中引入代理 PK 並在 Model 中使用它。

他們的利弊平衡:第一個選項允許更有效地執行模型和製造之間的連接,第二個選項使用的記憶體略少。

引用自:https://dba.stackexchange.com/questions/230468