Database-Design
需要復合外鍵的複合主鍵的方法
這是一個名為 Make 的表(
name
PK 在哪裡)name|other columns ---------------------- A | ... B | ... C | ...
還有一個名為 Type 的表(其中
make, name
PK 和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
。擺脫這種冗餘的方法是什麼?
我相信我可以在表中添加一個唯一
id
列Type
,以便Model
表可以將其作為 FK 引用。但似乎這個額外的列只是另一種形式的冗餘,因為make, name
已經可以唯一地標識每一行了嗎?
不久前,當我有一個類似的問題時,我編譯了這個比較。我希望它有幫助!
沒有業務意義的 BIGINT 類型的代理鍵是唯一滿足作為主鍵的所有技術要求的鍵:適用、唯一、穩定和最小化。複合鍵是備用候選鍵。由於上面列出的原因,它可能會提供性能優勢,但它肯定是不穩定的。
兩種設計都是可能的、合理的和非冗餘的(從某種意義上說,在一個解決方案中沒有任何數據可以在不失去資訊的情況下消除):1)將 Type 的 PK 作為對(make、name)並將其用作外部鍵入 Model,或在 Type 中引入代理 PK 並在 Model 中使用它。
他們的利弊平衡:第一個選項允許更有效地執行模型和製造之間的連接,第二個選項使用的記憶體略少。