2015-05-04 55 views
0

現狀:SQL Server表主鍵和外鍵位於相反的表中?

我有2個表:

表1

TrackID PK 
random columns 
ActionID FK 

表2

ActionID PK 
random columns 
TrackID FK 

問題: 有上述設定一個問題,如果有啥(正常化?)還是需要更多信息...?

感謝

+0

是的,你肯定有問題。你怎麼能添加一行到任何一個表?您構建這些鍵的方式意味着您不能向任一表添加新行,除非外鍵的值已存在於其他表中。這是一個非常糟糕的設計。 –

+0

兩個表都不需要有FK到另一個。你只需要一個顯示關係。 –

+0

Track(TrackID)表是主表。當對Track(行)採取「行動」時,Action表獲得一行,Track表用ActionID更新。 Track表中的ActionID不是必需的。然而,Action表的TrackID是必需的... – Suge

回答

0

所提供的架構模型兩個實體由兩個不同的關係連接。

第一關係R1 Track - * ---- 1 - Action由場ActionID表1

第二關係R2 Track - 1 ---- * - Action由場的TrackID於表2

建模建模如果您的要求這可能是有效的模式表明你有兩種不同的關係。

這種情況下的一個簡化的例子將包括兩個實體EmployeeProject

的關係

managesEmployee - 1 ---- * - Project

和關係

worksEmployee - * ---- 1 - Project

假設一名員工僅適用於最多一個項目。

這裏的問題是你想建模一個或兩個關係嗎?

如果你想模擬你的實體之間的一種關係,那麼你的模式有點不對,否則它是正確的。

0

上述設置有問題嗎?

不,這個詞的古典含義沒有「問題」。你可以堅持你的設計,這將沒有問題。但是,它是標準嗎?這就是我將在下一節討論的內容。

什麼(正常化?)還是需要更多信息...?

是的,正如我上面所暗示的那樣,爲了標準化或「標準化」您的設計,我可以提供以下信息。不幸的是,你對這個數據庫設計的目的不是很清楚。知道這個目的對於充分回答這個問題是至關重要的。不過,我會解決兩個可能的目的,我想你有其中一個。

目的1:每個音軌最多隻能有一個動作:在這種情況下,您不需要兩個表格。你可以有:

TrackID PK 
random columns 
random columns of actions /*(will stay null if no action takes place)*/ 

目的2:每個軌道可以有零或多個動作:在這種情況下,你需要兩個表如下所示:

表1:

TrackID PK 
random columns 

表2:

ActionID PK 
random columns 
CreateDate /*(search for creating a DateTime column with default to current date)*/ 
TrackID FK 

所以,如果你想要的最新或當前租賃行動,您可以選擇排名前1,並通過CreateDate desc與訂單相關。

+0

我遠離單個表的主要原因是由於「操作」列爲空。曲目可以有0或1個「動作」。一個「行動」必須有1個,只有1個「軌道」。 – Suge

+0

當您沒有操作時,將Action列設爲空值沒有問題。這不是一個糟糕的設計,所以你並不需要遠離它。如果你願意,你可以在軌道表上有一個標誌欄來表示軌道是否有動作(你在動作欄上仍然有空) – yazanpro