簡體   English   中英

SQL Server外鍵到多個表

[英]SQL Server foreign key to multiple tables

我有以下數據庫架構:

members_company1(id, name, ...);
members_company2(id, name, ...);
profiles(memberid, membertypeid, ...);
membertypes(id, name, ...)
[ 
       { id : 1, name : 'company1', ... }, 
       { id : 2, name : 'company2', ... }
];

因此,每個配置文件屬於某個成員,來自membertypeidmembertypeid具體取決於membertypeid

members_company1     —————————      members_company2     
————————————————                    ————————————————
id      ——————————> memberid <———————————         id
name               membertypeid                 name
                       /|\
                        |  
                        |  
      profiles          |  
      ——————————        |  
      memberid  ————————+  
      membertypeid

我想知道是否可以在profiles表中創建一個外鍵,以便基於memberidmembertypeid對引用參照member_company1或members_company2表記錄?

外鍵只能引用一個表,如文檔中所述(強調我的):

外鍵(FK)是列或列的組合,用於在兩個表中的數據之間建立和實施鏈接。

但是如果你想開始清理,你可以創建一個@KevinCrowell建議的members表,從兩個members_company表中填充它並用視圖替換它們。 您可以在視圖上使用INSTEAD OF觸發器將“重定向”更新到新表。 這仍然是一些工作,但它將是一種修復您的數據模型而不破壞現有應用程序的方法(當然,如果它在您的情況下是可行的)

在您無法更改表結構的情況下運行:

選項1

參考誠信對你有多重要? 你只是在這些表之間進行內連接嗎? 如果您不必過於擔心,那就不用擔心了。

選項2

好的,你可能要對此做些什么 也許你只有內連接,但你必須處理與成員表中的任何內容無關的配置文件中的數據。 你能創建一個每天或每周運行一次的工作來清理它嗎?

選項3

是的,那一個也可能不起作用。 您可以在配置文件表上創建一個觸發器,用於檢查對成員表的引用。 這遠非理想,但確實可以保證即時檢查。

我的看法

我會選擇選項2.你顯然處理的是一個不太理想的架構。 為什么要讓它變得更糟。 讓糟糕的數據持續一周; 每個周末都要打掃桌子。

來吧你可以創建一個表,但你不能修改members_company1或members_company2?

在將新記錄插入members_company表時,您創建成員表的想法將需要更多操作。
所以你可以在members_company1和members_company2上創建觸發器 - 那不是修改?

你能做什么有什么限制?

如果您只需要選擇與members_company1和members_company2的兼容性,那么創建一個真實成員表並為members_company1和members_company2創建視圖。
基本選擇不知道它是另一端的視圖或表。

CREATE VIEW dbo.members_company1
AS
SELECT id, name 
FROM members
where companyID = 1

您甚至可以使用替代方法處理插入,更新和刪除

INSTEAD OF INSERT觸發器

外鍵不能引用兩個表。 假設您不想通過合並members_company1members_company2表來更正您的設計,最好的方法是:

將名為member_company1_idmember_company2_id兩列添加到profiles表中,並為這兩個表創建兩個外鍵並允許nulls 然后,您可以添加約束以確保其中一列始終為null而另一列不是。

不可以。外鍵可以引用一個且只有一個主鍵,並且無法在表之間傳播主鍵。 您希望實現的邏輯類型需要使用觸發器或重構數據庫,以便所有成員都基於單個表中的核心記錄。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM