Database-Design

多對多關係中的 2 個外鍵

  • August 5, 2022

數據庫專家您好!

我正在設計一個小型數據庫並遇到這樣的情況,即兩個外鍵在同一個表中,根據不同的操作引用父表中的不同行。讓我解釋。

最典型的N:M關係範例是學生註冊課程、產品被標記、租戶租用公寓等。但所有這些都只描述了一個動作(註冊、標記、租用等),所以當兩個不同的動作被執行時會發生什麼同一個子表?例如,正在發送和接收的消息。

假設我們有兩個表,users並且messages我們有以下業務邏輯:

一個使用者可以發送和接收多條消息。

一條消息由使用者發送並由另一使用者接收。

因此,該message表將有 2 個外鍵,sender_id並且 receiver_id,兩個使用者。

這是我感到困惑的地方。我們可以使用外鍵創建一個連接表,例如user_idandmessage_id但是使用者 X 發送的消息和使用者 Y 接收的消息將全部保存在同一個表中,我不知道這是否正確(不是焦點表)。

messages我們應該在表中保留兩個外鍵嗎?

我在發布這個問題之前進行了搜尋,我有兩個連結

在這里人們說我們應該為N:M關係創建連接表,但同樣是執行一個操作的範例。

在這裡,人們似乎對子表的兩個外鍵的想法很滿意。

設計這樣的關係的正確方法是什麼?

… 使用者 X 發送的消息和使用者 Y 收到的消息將全部保存在同一個表中 …

我們應該將兩個外鍵保留在消息表中嗎?

簡短的回答 - 是的。

每條消息都有一個發件人,該發件人必須是有效使用者。

每條消息都有一個接收者,它必須是有效的使用者。

因此,這些欄位中的每一個都需要使用者表的外鍵,如下所示:

create table table1 
( ... 
, sender_id integer ... 
, receiver_id integer ... 
... 
, foreign key ( sender_id ) references users ( id )
, foreign key ( receiver_id  ) references users ( id )
...
); 

引用自:https://dba.stackexchange.com/questions/315228