0

我有一些用戶和代理的數據庫,並希望添加一個簡單的消息系統。用於將表與其他表中的一個相關聯的數據庫設計

所以,我有以下簡單的一組表:

[users] 
- user_id (PK) 

[agents] 
- agent_id (PK) 

[message_threads] 
- message_thread_id (PK) 

[message] 
- message_id (PK) 
- message_thread_id (FK messages_threads.message_thread_id) 

我沒有從消息和誰發佈的消息,個人的關係。

有一點我卡住了,因爲它可能是用戶或代理。我認爲這是一個普遍存在的問題,但我沒有找到這樣的討論。

我知道我有幾個選擇,但他們都有缺點。

選項1: 我不喜歡這樣的消息可以鏈接到兩個不同的帳戶。

[message] 
- message_id (PK) 
- message_thread_id (FK messages_threads.message_thread_id) 
- user_id (FK users.user_id, ALLOW NULL) 
- agent_id (FK agents.agent_id, ALLOW NULL) 

選項2: 這使它尷尬獲得在SELECT的一列的所有消息。

[message_by_user] 
- message_id (PK) 
- message_thread_id (FK messages_threads.message_thread_id) 
- user_id (FK users.user_id) 

[message_by_agent] 
- message_id (PK) 
- message_thread_id (FK messages_threads.message_thread_id) 
- agent_id (FK agents.agent_id) 

我不能將用戶和代理組合到一個表中。這是成立的。

回答

3

這聽起來像用戶和代理是超類的每個子類,我會稱之爲「人員」。您可以爲人員提供一張桌子,person_id作爲PK。然後,您可以用user_id替換users表中的person_id。同樣,將agent_id替換爲agents表中的person_id。

注意到在這兩個子類表中,用戶和代理人,person_id是雙重責任。這是它自己桌子上的PK,也是人桌上的FK。這強化了用戶與個人之間以及代理與個人之間的IS-A關係的一對一性質。

現在,你所要做的就是建立一個消息和人之間的關係,並嘿presto!視情況而定,消息與用戶或代理之間有關係。

這是名爲「類表繼承」的設計模式的一個實例和名爲「共享主鍵」的實例。通過訪問Stackoverflow中的相同名稱的標籤,或者通過在網絡上搜索Martin Fowler對該主題的處理,可以獲得關於這些信息的更多信息。

+0

關於這個設計的一個很好的討論可以在[如何將IS-A關係映射到數據庫中?](http://dba.stackexchange.com/questions/5501/how-doi-i-地圖-AN-is-a的關係 - 進入 - 一個數據庫) – user2045006 2015-01-01 22:18:37

相關問題