簡體   English   中英

Postgres外鍵到多個表

[英]Postgres foreign key to multiple tables

我有以下概念性問題,但我尚未為他們提出令人滿意的解決方案。 我將舉一個例子來解釋。

我有2表, catsdogs ,它是由不同屬性的(他們需要的是不同的表,因為我的真實情況其實更為復雜)。 我可以喂食這些“動物”,並且希望跟蹤有關該喂食操作的一些信息(例如[animal_fed]food_typefood_quantitydate ,...)。

到目前為止,我正在使用具有以下模式的feeds表: animal_id INTEGERtable_name VARCHAR(50) (可以是"cats""dogs" ,但還會有更多其他種類。), [other fields]

我對這種解決方案完全不滿意,因為select from feeds (同時join )也很麻煩(即使可能,但必須有一種方法) select from feeds進行select from feeds

我怎樣才能更好地解決這個問題?

使用“父”表會代表一個好的解決方案嗎?

或者,如果您認為我的實際方法是好的,那么我如何進行"join"以獲得所有feeds信息以及動物name

謝謝。

有幾種方法可以改善它,但是您的解決方案幾乎是不錯的:

  1. 將所有動物放在一張桌子上 您說過它們需要有所不同,但是也許您可以合並它們。 最終的animas表將包含兩個表中的所有列。 然后您將獲得列animal_type ,它可以是dogcat
  2. 多個SQL查詢 您將一切保持不變,並使用一些方法/功能來獲取所需的數據。 進行查詢以獲取所有提要 ,然后在另一個查詢中可以獲取那些動物。 如果要限制查詢,則可以FROM animals WHERE id IN ( ANIMAL_ID_FROM_PREVIOUS_RESULT )添加條件。 然后,您必須將它們合並到您的應用程序中。
  3. 您可以制作兩個關系表。 您將有animals表姊的feeds表與您共創r_dog_feedr_cat_feed 它們將具有feed_id ,該feed_id將引用feeds表,然后是dog_idcat_id 然后,您可以使用UNION編寫SQL:

SELECT dogs.name作為食物名稱。* FROM r_dog_feed JOIN狗進入dogs.id = r_dog_feed.dog_id JOIN feeds.id = r_dog_feed.feed_id UNION選擇cats.name作為食物名稱。* FROM r_cat_feed JOIN catsON dogs.id = r_cat_feed.cat_id JOIN飼料ON feeds.id = r_cat_feed.feed_id

如果您不能將貓和狗的數據放在同一張表中,那么另一個好的解決方案是讓動物表保存貓和狗的常用數據。 然后,您可以在動物和貓之間以及動物和狗之間設置一對零或一個關系。

在動物上,您添加了animal_type,該類型告訴您將在其他表格上找到特定的額外信息。

在貓和狗上,您可以在動物表中添加帶有FK的animal_id。

在feed上,您對動物表具有animal_id和FK。

優點

您可以輕松處理飼料和動物之間的關系。 SQL比只需要訪問常見動物信息更容易編寫。

某些應用程序框架確實支持“繼承的”數據子類型,並且確實為您處理了其中的大多數。 但是,由於您對應用程序使用的內容一無所知,因此我不確定這是否適用。

缺點

您不能僅通過數據庫約束來強制執行完整性。 您將需要觸發器或應用程序邏輯來保證沒有貓或狗引用相同的animal_id,並且每個動物都是貓還是狗(如果這是您的要求之一)。

當您需要訪問cat和dog的額外信息時,您可能需要單獨的SQL語句,因為結構不同並且對數據的訪問必須使用不同的表。

如果您需要添加其他動物類型,則將添加表...,還添加其他SQL以訪問額外的信息...這不是很漂亮,並且可能會失控。

暫無
暫無

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

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