Postgres 多个表的外键

met*_*jus 6 sql postgresql foreign-keys

我有以下概念性问题,我还没有找到令人满意的解决方案。我将用一个例子来解释它。

我有 2 个表catsdogs,它们由不同的属性组成(它们需要是不同的表,因为我的实际情况实际上更复杂)。我可以喂养这些“动物”,并且我想跟踪有关此喂养操作的一些信息(例如[animal_fed],,,,,food_type... )。food_quantitydate

现在我正在使用feeds具有以下模式的表:animal_id INTEGER, table_name VARCHAR(50)(可能是"cats""dogs",但会有更多的物种..),[other fields]

我对这个解决方案完全不满意,因为它使检索有关被喂养的动物的一些信息变得很痛苦(如果可能的话,但必须有一种方法..)select from feeds(类似于join)。

我怎样才能更好地解决这个问题?

使用“父”表是一个好的解决方案吗?

或者,如果您认为我的实际方法很好,我怎样才能"join"获得所有feeds信息加上动物name

谢谢。

Lad*_*lay 2

有多种方法可以改进它,但您的解决方案几乎很好:

  1. 将所有动物放在一张桌子上。你说它们需要不同,但也许你可以合并它们。最终animals表将包含两个表中的所有列。您将拥有animal_type列。
  2. 多个 SQL 查询。您保留一切原样,并创建一些方法/函数来获取您需要的数据。进行查询以获取所有提要,然后在另一个查询中您可以获取这些动物。如果你想限制查询可以添加条件FROM animals WHERE id IN ( ANIMAL_ID_FROM_PREVIOUS_RESULT )。然后您必须将它们合并到您的应用程序中。
  3. 您可以制作两个关系表。您将拥有animals表 anefeeds表并创建r_dog_feedr_cat_feed。他们将有feed_idwhich 将引用feeds表,然后要么dog_id要么cat_id然后你可以使用UNION编写 SQL :

SELECT dogs.name 作为名称、食物。* FROM r_dog_feed JOIN dogs ON dogs.id = r_dog_feed.dog_id JOIN feeds ON feeds.id = r_dog_feed.feed_id UNION SELECT cats.name 作为名称、食物。* FROM r_cat_feed JOIN catsSON dogs.id = r_cat_feed.cat_id JOIN feeds ON feeds.id = r_cat_feed.feed_id