[英]Postgres foreign key to multiple tables
我有以下概念性問題,但我尚未為他們提出令人滿意的解決方案。 我將舉一個例子來解釋。
我有2表, cats
和dogs
,它是由不同屬性的(他們需要的是不同的表,因為我的真實情況其實更為復雜)。 我可以喂食這些“動物”,並且希望跟蹤有關該喂食操作的一些信息(例如[animal_fed]
, food_type
, food_quantity
, date
,...)。
到目前為止,我正在使用具有以下模式的feeds
表: animal_id INTEGER
, table_name VARCHAR(50)
(可以是"cats"
或"dogs"
,但還會有更多其他種類。), [other fields]
。
我對這種解決方案完全不滿意,因為select from feeds
(同時join
)也很麻煩(即使可能,但必須有一種方法) select from feeds
進行select from feeds
。
我怎樣才能更好地解決這個問題?
使用“父”表會代表一個好的解決方案嗎?
或者,如果您認為我的實際方法是好的,那么我如何進行"join"
以獲得所有feeds
信息以及動物name
?
謝謝。
有幾種方法可以改善它,但是您的解決方案幾乎是不錯的:
animas
表將包含兩個表中的所有列。 然后您將獲得列animal_type
,它可以是dog或cat 。 FROM animals WHERE id IN ( ANIMAL_ID_FROM_PREVIOUS_RESULT )
添加條件。 然后,您必須將它們合並到您的應用程序中。 animals
表姊的feeds
表與您共創r_dog_feed
和r_cat_feed
。 它們將具有feed_id
,該feed_id
將引用feeds
表,然后是dog_id
或cat_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.