2

我意識到可能存在類似的問題,但我找不到足夠接近指導的問題。替代鍵作爲複合鍵上的外鍵

鑑於這種規範,

Site 
--------------------------- 
SiteID  int identity 
Name  varchar(50) 

Series 
--------------------- 
SiteID  int 
SeriesCode varchar(6) 
... 
--SeriesCode will be unique for every unique SiteID 

Episode 
---------------------- 
SiteID  int 
SeriesCode varchar(6) 
EpisodeCode varchar(10) 
... 

我提出的設計/實施

Site 
---------------------------- 
SiteID  int  identity 
Name  varchar(50) 


Series 
------------------------------------------- 
SeriesID int  identity, surrogate key 
SiteID  int   natural key 
SeriesCode varchar(6) natural key 
UNIQUE(SiteID, SeriesCode) 
... 

Episode 
------------------------------------------- 
EpisodeID int  identity, surrogate key 
SeriesID int  foreign key 
EpisodeCode varchar(6) natural key 
... 

什麼問題呢?在這裏將SeriesID代理作爲外鍵*可以嗎?我不確定是否遺漏了可能出現的任何明顯問題。或者,使用複合自然鍵(SiteID + SeriesCode/SiteID + EpisodeCode)會更好嗎?從本質上講,這將解耦來自Series系列表的Episode表,並不適合我。

值得注意的是,在原始輸入數據中,SeriesCode看起來像'ABCD-1'和EpisodeCode,它將填充這些表格,所以這是另一件可以改變的東西。

*:「虛擬」的外鍵,因爲它是由上級預先決定,我們不應該使用實際外鍵

回答

4

是的,這一切都看起來很好。我可能做的唯一(次要)點是,除非另有第4個子表掛在Episode上,否則可能不需要EpisodeId,因爲Episode.EpisodeCode是一個足以在Episode中標識和查找行的單一屬性自然鍵。當然,將它留在那裏並不是什麼壞處,但作爲一般規則,我添加了代理鍵作爲子表中FK的目標,並嘗試爲每個表添加一個內容鍵以識別和控制冗餘數據行。所以如果一張桌子沒有其他FK引用它的表格(並且永遠不會),我有時候不會在裏面包含一個代理鍵。

+0

好點。事實上,將會有附加的表與情節相關聯。這些只是整個數據庫的基表。 – 2009-10-27 17:57:07

1

什麼是「虛擬」外鍵?上級決定不使用外鍵約束嗎?在那種情況下,你根本不使用外鍵。你只是假裝。

並且是Episode實體的最佳選擇?這不是真的意味着Show或Podcast等等,而是恰好總是現在是一系列的一部分?如果是這樣,未來會發生什麼變化? Episode最終會被濫用以包含系列之外的Show嗎?在這種情況下,通過系列將Episode連接到Site可能會困擾你。

考慮到這一切,並假設你作爲一個咕嚕聲可能無法改變它:如果我是你,我會盡可能使用自然鍵感到更安全。在沒有外鍵約束的情況下,它可以更容易地識別錯誤數據,如果稍後必須訴諸某種SeriesCode ='EMPTY'技巧,那麼使用自然鍵也更容易。

+0

確實沒有FK的限制。 至於實體的選擇,它是一個網絡電視查看數字的數據庫,它將被綁定到現有的普通電視放映數據庫中,用於並排顯示查看數字。已經決定頂層將成爲「系列」或「季節」,然後將會有整個電視節目,相關剪輯和額外/獎勵素材。可能最終會調用「Episodes」「剪輯」。將沒有獨立的剪輯沒有被註冊爲「系列」,但正如你所指出的那樣,爲未來開放這個門是一個好主意。 – 2009-10-27 17:54:19

0

我的建議:

使用自然/業務作爲主鍵時,除了在以下3種情況可能

  1. 自然/業務的關鍵是在插入
  2. 的時刻 未知
  3. 自然/商業關鍵是不好(這不是唯一的,它很容易改變)
  4. 自然/業務的關鍵是超過3列的複合材料和表格將有子表

在情況1和2的替代關鍵是需要選用

在情況3中,代理鍵強烈推薦推薦