Database-Design
多對多關係中的 2 個外鍵
數據庫專家您好!
我正在設計一個小型數據庫並遇到這樣的情況,即兩個外鍵在同一個表中,根據不同的操作引用父表中的不同行。讓我解釋。
最典型的
N:M
關係範例是學生註冊課程、產品被標記、租戶租用公寓等。但所有這些都只描述了一個動作(註冊、標記、租用等),所以當兩個不同的動作被執行時會發生什麼同一個子表?例如,正在發送和接收的消息。假設我們有兩個表,
users
並且messages
我們有以下業務邏輯:一個使用者可以發送和接收多條消息。
一條消息由使用者發送並由另一使用者接收。
因此,該
message
表將有 2 個外鍵,sender_id
並且receiver_id
,兩個使用者。這是我感到困惑的地方。我們可以使用外鍵創建一個連接表,例如
user_id
andmessage_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 ) ... );