0

我有一個簡單的地址簿,收集人員和公司的信息。 所以我有以下3個表,然後其他類似電子郵件,PHONENUMBER,地址掛鉤聯繫:無法創建外鍵約束

CREATE TABLE [dbo].[Contact] (
    [ID]  INT   IDENTITY (1, 1) NOT NULL, 
    ... 
    CONSTRAINT [PK_Contatto] PRIMARY KEY CLUSTERED ([ID] ASC) 
); 

CREATE TABLE [dbo].[Person] (
    [ID]   INT   IDENTITY (1, 1) NOT NULL, 
    [IdContact] INT   NOT NULL, 
    [IdCompany]  INT   NULL, 
    ... 
    CONSTRAINT [PK_Person] PRIMARY KEY CLUSTERED ([ID] ASC), 
    CONSTRAINT [FK_Person_Company] FOREIGN KEY ([IdCompany]) REFERENCES [dbo].[Company] ([ID]) ON DELETE SET NULL ON UPDATE CASCADE, 
    CONSTRAINT [FK_Person_Contact] FOREIGN KEY ([IdContact]) REFERENCES [dbo].[Contact] ([ID]) ON DELETE CASCADE ON UPDATE CASCADE 
); 

CREATE TABLE [dbo].[Company] (
    [ID]   INT   IDENTITY (1, 1) NOT NULL, 
    [IdContact] INT   NOT NULL, 
    ... 
    CONSTRAINT [PK_Company] PRIMARY KEY CLUSTERED ([ID] ASC), 
    CONSTRAINT [FK_Company_Contact] FOREIGN KEY ([IdContact]) REFERENCES [dbo].[Contact] ([ID]) ON DELETE CASCADE ON UPDATE CASCADE 
); 

基本上我想,如果有人刪除聯繫人也與此有關的人/公司都將被刪除。此外,如果有人刪除與某人關聯的公司,則必須將該人的IdCompany設置爲空。

由於「循環創建或附加傳播路徑創建」而無法創建的約束是FK_Person_Contact。

我錯過了什麼?

回答

0

我懷疑'循環創建'是因爲人員表引用聯繫人表和公司表,並且公司表也引用聯繫人表。

人員記錄和公司記錄可以引用不同的聯繫人記錄嗎?

人A - >聯繫 - >公司A - >請聯繫B

還是應該由個人記錄和公司記錄引用同一聯繫人?

人A - >聯繫 - >公司A - >聯繫

如何界定聯繫,人與公司之間的關係?

  • 1聯繫人有很多人嗎?
  • 1聯繫人有很多公司嗎?
  • 1人有很多聯繫人?
  • 1 Person has 1 Company?
  • 1人有很多公司嗎?
  • 1公司有很多聯繫方式?
  • 1公司有很多人?

您可能需要考慮一個或多個鏈接表來正確建模關係。

+0

聯繫人指的是一個人或一個公司。 因此,人員和公司無法引用同一聯繫人。 聯繫多個地址/電話號碼/電子郵件已連接。 Person.IdCompany可能指公司(如果它適用於該公司)。 可能需要將Person.IdCompany連接到該公司的聯繫人,而不是直接連接到公司表? – DkSw 2013-05-10 08:51:28

+0

您可能會更好地將聯繫人與個人和個人鏈接到公司。換句話說,聯繫人是可以或不可以爲公司工作的人;聯繫人通過人員鏈接到公司。您仍然可以從人員 - 公司鏈接找到與公司相關的所有人員。 – 2013-05-10 10:00:27

+0

對不起,不能這樣做。該地址簿鏈接到屬於租用服務的較大數據庫,因此聯繫人可能僅指公司而不涉及任何參考人員。聯繫人可能是租車的人或租車的公司的人。一個人偶爾可能會爲一家公司工作,但也可以爲了私人目的租車。你怎麼看我說的?人員FK只能通過公司聯繫方式與FK聯繫,而不是直接像現在一樣。所以沒有更多的三角測量,但都以「V」模式通過聯繫表。合法的? – DkSw 2013-05-10 10:12:54