簡體   English   中英

具有外鍵的表可以引用不同的表

[英]Table with foreign key that can reference different tables

我正在嘗試為收件箱應用程序構建一個表,該表將其消息存儲在inbox表中。

該表的結構如下:

inbox_id|sender_id|receiver_id|subject|message

sender_idreceiver_id外鍵和可以引用多個表。

數據庫中目前有3種類型的用戶,他們都可以相互發送消息。 類型UserType1可以將消息發送到UserType2 ,反之亦然,或者UserType1可以將消息發送到UserType1 因此,接收方和發送方可以引用這三個表之一。

我對這個問題的解決方案是建立一個包含每個用戶類型的列的inbox_user表,並讓sender_idinbox_user引用它。

我主要關心的是解決方案的靈活性有限以及資源的浪費。 我將始終始終每行有2個空列。 如果我引入更多的用戶類型,那將變得更糟。

這會被視為不良做法嗎? 有哪些更靈活,更智能的設計?

從您的描述看來,最佳做法應該應用於用戶表,而不是此收件箱表。 當然,我不知道您的約束,但是如果您有2或3種類型的用戶,而每種類型的用戶都在自己的表中,那是一個糟糕的設計(同樣,不知道您的約束)。 首選項是將所有用戶存儲在一個表中,並帶有一列以指示其類型。 然后,發件人和收件人FK都指向同一用戶表,因此對收件箱表的引用變得簡單明了。

否則,您將最終使用多列來引用您所說的每個表(UserTypeASenderID,UserTypeBSenderID,UserTypeCSenderID等)。 我的首選是擁有空的FK列並獲得引用完整性,而不是實施其他解決方案並失去約束。

3種不同類型的用戶是經典類型/子類型的情況。 (或者,如果您願意,可以選擇類/子類)。 有幾種方法可以設計類/子類情況。 Martin Fowler解釋說,對我來說不錯的兩個是“類表繼承”和“單表繼承”。 您可以在線找到簡介。 您還可以在這里訪問這些名稱的標簽,閱讀顯示的信息,並查看標記的問題。

正如您在Q中指出的那樣,單表繼承的某些字段有時會出現很多NULL,這對您來說可能是,也可能不是問題,具體取決於您的情況。

當在子類(子類型)中創建新條目時,類表繼承涉及一些編程。 它還涉及更多的聯接,但是聯接不是很昂貴。 類表繼承通常與稱為共享主鍵的技術結合使用。 在這種技術中,子類表以一個主鍵結束,該主鍵與超類表中的主鍵重復。 它也是超類表的外鍵。 這使連接子類數據和超類數據變得簡單,容易和快速。

共享主鍵解決了您在Q中陳述的難題,即如何用一個外鍵引用多個表。 其他表中對超類表的外鍵引用也將是對至少一個子類表的引用。 這看起來像魔術。 試試看,看看是否喜歡。

暫無
暫無

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

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