首页 > 解决方案 > PostgreSQL 中的连接表

问题描述

我有两张桌子

recipe table
-----------------------
|recipe_id   |name  |
-----------------------
|1           |Pasta |
|2           |Pizza |
|3           |Fish  |


ingredient table
-------------------------------
|ingredient_id   |name        |
-------------------------------
|1               |Spaghetti   |
|2               |Salmon      |
|3               |Tomato sauce|

我创建了一个名为“recipes_ingredients”的连接表

-------------------------------
|id   |fk_recipe|fk_ingredient|
-------------------------------
|1    |1        |1           |
|2    |2        |3           |
|3    |3        |2           |

我的第一个问题是:我创建“recipes_ingredients”表的方式是否正确?我需要“id”还是只需要两个外键“fk_recipe”和“fk_ingredient”?

第二个是当我在其他两个表中插入记录时是否可以自动填充联结表。还是我必须手动添加联结表中的每个关联?

标签: sqlpostgresqljunction-table

解决方案


我的第一个问题是:我创建“recipes_ingredients”表的方式是否正确?我需要“id”还是只需要两个外键“fk_recipe”和“fk_ingredient”?

你的接线表看起来很棒!您在 recipes_ingredients 中的 ID 将自动编号。我会将 fk_recipe 重命名为recipe_id并将 fk_ingredient 重命名为ingredient_id,但是保持它的方式也是完全可以的。它是基于偏好的。

第二个是当我在其他两个表中插入记录时是否可以自动填充联结表。还是我必须手动添加联结表中的每个关联?

通常,您会手动输入成分表中没有的成分,输入新的配方名称,最后在联结表中添加条目。

但是,如果您有这样的规则:所有包含单词 Pizza 的食谱都将包含成分 1、2 和 3,那么您可以创建一个具有逻辑的存储过程,以根据您的规则在联结表中添加信息。您无法使用存储过程涵盖所有用例,因此您仍然必须转到联结表并手动添加一些条目。

通常,Web 开发人员创建一个网页,该网页允许使用网页创建食谱然后允许选择(或拖放)成分的这种交互。在后台,网页会更新联结表。


推荐阅读