【问题标题】:Junction table in PostgreSQLPostgreSQL 中的连接表
【发布时间】:2021-11-10 23:20:04
【问题描述】:

我有两张桌子

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”?

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

【问题讨论】:

  • 请在每个帖子中只问 一个 问题,除非这几个问题非常非常接近。
  • @zupus 你有几个答案。如果答案对您有所帮助,您是否介意通过将答案标记为已接受来结束您的问题?这将有助于其他正在查看已接受答案的问题的人。

标签: sql postgresql junction-table


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    【解决方案2】:

    如果联结表没有id 列会更好。主键应该在 (fk_recipe, fk_ingredient) 上——这应该是唯一的,无论如何都不是 NULL。

    您必须明确地向联结表添加元素 - 仅仅因为您添加了一个新配方,尚不清楚需要哪些成分。仅当某个配方需要某种成分时,连接表才应该有一个条目。

    联结表可以而且应该包含其他数据,例如所需成分的数量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-07
      • 2014-11-18
      • 1970-01-01
      • 1970-01-01
      • 2015-05-02
      • 2021-12-16
      相关资源
      最近更新 更多