2

所以,我在我的數據庫這兩個表:創建表之間有一個一對一的關係與現有的一對多關係

Companies 
-------------------- 
CompanyID (PK) 
Name 


Employees 
-------------------- 
EmployeeID (PK) 
CompanyID (FK) 
Name 

基本上,一個公司有很多員工。

但我希望讓每家公司都有一名員工是主要聯繫人。我最初的想法是在Companies表中添加一個MainContactID字段,該表引用Employees中的EmployeeID,但這會創建一個包含關係的循環。

這樣做的最好方法是什麼?

回答

2

你的最初想法沒有(在我看來)是錯誤的。

雖然有一個循環如你所說,這裏沒有問題。

擁有companies.MainContactEmployeeID可確保每家公司只有一個此類聯繫人。

然後,添加一個外鍵Companies(CompanyID,MainContactEmployeeID)Employees(CompanyID,EmployeeID)確保該員工實際上爲該公司工作。 (需要Employee表上的匹配唯一索引)。

這樣的外鍵只有因'循環'纔有可能。這當然不是問題。

+0

這將創建一個循環引用的情況,員工已經是公司的孩子,它不能也是父母,否則你將無法插入記錄。 – HLGEM 2012-03-19 19:06:07

+2

@HLGEM - 我不同意,這是我用過的一種模式,它確實有效。 '1.'創建沒有MainContact的公司(NULL FK)。 '''爲該公司創建小孩僱員。 '3.'將公司的主要聯繫人更新爲您創建的其中一名員工。 – MatBailie 2012-03-19 19:53:03

0

創建表的組合主鍵,就像這樣:

Company_MainContact 
-------------------- 
EmployeeID (PK) (FK-->Employee) 
CompanyID (PK) (FK-->Company) 
+0

雖然這確實有用,並且有其自身的優點,但我認爲OP對於爲什麼會對建議的選項感興趣。你有沒有理由這樣做,當它總是1:1? – MatBailie 2012-03-19 18:55:35

+0

假設數據庫已經被填充,並且「工作」並且這個主要聯繫人標識符是一個新的需求,這可能是最快和最簡單的解決方案,而不需要1)重構數據模型,或者2)醜陋的黑客相關觸發器等。 – Chad 2012-03-19 19:16:04

+0

此解決方案不是100%正確的。通過這種方式,公司的主要聯繫人可以是爲另一家公司工作的人員。 – 2012-03-20 08:17:22

1

我個人比較喜歡這種模式:

Organization 
------------- 
organization_id 
name 
other_columns 

Person 
------------- 
person_id 
name 
other_columns 

Person_Organization 
-------------------- 
person_id 
organization_id 
begin_date 
end_date 
relationship_cd 

這使人們能夠在一個時間超過一個組織工作(當然可能),並允許你在關係定義上非常靈活 - 所以這個人在這個時候與這個組織有什麼關係......(對承包商來說很重要)

+0

您如何執行「最多1名員工作爲主要聯繫人」? – MatBailie 2012-03-19 18:54:18

+1

可能有幾種方法 - 您可以對Person_Organization採用約束或插入/更新觸發器來強制執行「Max 1 Employee」。我認爲用這種方式強制執行這個過程是非常容易的,而不是直接把它燒成表格結構。 – 2012-03-19 19:07:02

2

我們通過地址,電子郵件和電話進行一些類似的事情。我們有一個標誌着主要記錄的領域。然後通過觸發器維護此字段,以便如果主要聯繫人發生變化,您仍然只有一個聯繫人,並且如果主要聯繫人被刪除,則觸發器使用業務規則來確定哪個剩餘記錄會獲得該標記,因爲我們必須如果我們有任何記錄,至少有一個主要記錄。

1

如果你不希望有

  • 圓形路徑在FK關係
  • 空值的FK列

您可以使用此:

添加UNIQUE限制在Employee(CompanyID, EmployeeID)並製作另一個表格:

Company_MainContact 
-------------------- 
CompanyID (PK) (FK1-->Employee) 
EmployeeID  (FK1-->Employee) 
相關問題