2014-01-24 45 views
0

我目前正在使用社交媒體應用程序的數據庫。數據庫在postgresql上運行,我遇到了一個邏輯問題。Postgres中的合成外鍵

我有兩種不同類型的內容可以提交,主題和帖子。每個都有自己的主鍵。

所有這些都有項目可以有一些媒體附加到他們。在我的媒體表中,我有列content_type_id和content_id,其中內容類型是查找表中具有不同類型的內容的關鍵字,而content_id是表格中存儲該特定內容的主鍵。

我遇到的問題是,我無法在content_id上創建外鍵,因爲根據content_type,它可能指向兩個表中的一個。有沒有一種方法可以根據content_type_id列的值設置forgein鍵來查看適當的表格?

+0

請提供您的餐桌DDL。 – Kuberchaun

+0

聞起來不好的設計。見例如http://stackoverflow.com/questions/13311932/foreign-key-referencing-multiple-tables – leonbloy

回答

1

我不確定要理解你的問題,但是你有設計問題。如果我理解對不對,也許你需要這樣的設計:

enter image description here

,但我不知道,如果你不提供當前的設計。

這種設計:

  • CONTENT_TYPE可以是POSTTOPIC
  • MEDIA可以有1 CONTENT_TYPEPOSTTOPIC)。
  • CONTENT_TYPE可能與N MEDIA有關。
+0

我遇到的問題是媒體是附加到內容(圖片,文檔或其他類型的文件)。因此,content_id也需要成爲表的附屬關鍵字,並附加到發佈ID或主題ID。由於帖子表和主題表可以有重疊的ID,我希望能夠使用content_type_id作爲顯示它是帖子還是主題的方式。但我不知道是否有一種方法,我可以有一個forgien關鍵約束根據另一列的值檢查其有效性。 – Jake

+0

要區分帖子或主題,您可以在「CONTENT_TYPE」上添加一列來執行此操作。您可以使用布爾值或更好的整數,以便將來能夠充分利用更多內容類型(1表示主題,0表示後期表達)。 – carexcer

0

問題已解決。而不是讓每個表都有它自己的主鍵序列,所有表都使用單個序列,實體類型查找表變成實體映射表,將現在的全局標識映射到實體類型(後,主題等)。這樣就不再需要輔助表來區分主鍵是帖子還是主題。

例如,在創建帖子之前,它使用sequental id作爲主鍵(1,2,3,4 ...),並且在創建主題時,會發生相同的事件(1, 2,3,4,...)。

當媒體將存儲在media_table中時,media_table將出現重複實體鍵(id爲1的帖子和id爲1的topic爲圖片)的問題。這最初設計的目的是通過在媒體表中添加一列來區分它是帖子還是主題。

通過對帖子和主題使用相同的順序,它們不再共享任何主鍵,因此不再需要使用實體類型來區分這兩個主鍵,並且主題和帖子中的主鍵將充當一個指向媒體表實體ID的超級鍵。