简体   繁体   中英

Junction table in PostgreSQL

I have two tables

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


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

I created a junction table called "recipes_ingredients"

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

My first question is: is it correct how I created the "recipes_ingredients" table? Do I need the "id" or I can just have the two foreign keys "fk_recipe" and "fk_ingredient"?

And the second one is if it's possible to autopopulate the junction table when I insert a record in the other two tables. Or do I have to add manually every single association in the junction table?

My first question is: is it correct how I created the "recipes_ingredients" table? Do I need the "id" or I can just have the two foreign keys "fk_recipe" and "fk_ingredient"?

Your junction table looks great! Your ID in recipes_ingredients will be auto numbered. I'd rename fk_recipe to recipe_id and fk_ingredient to ingredient_id , but it's totally fine to keep it the way you have it too. It's preference based.

And the second one is if it's possible to autopopulate the junction table when I insert a record in the other two tables. Or do I have to add manually every single association in the junction table?

Typically, you would manually enter ingredients that you don't already have in ingredients table, enter a new recipe name, and finally add entries in junction table.

However, if you have rules that say: All recipes containing the word pizza will have ingredient 1, 2 and 3, then you can create a stored procedure with logic to add information in the junctions table based on your rules. You can't cover all your use cases using a stored procedure, so you would still have to go to the junction table and add some entries manually.

Typically, web developers create a web page that allow such interaction of creating a recipe using a web page and then allowing selections of (or drag drop of) ingredients. In the background, the web page updates the junction table.

It would be better if the junction table had no id column. The primary key should be on (fk_recipe, fk_ingredient) – this should be a unique and not NULL anyway.

You'll have to add elements to the junction table explicitly - just because you add a new recipe, it is not yet clear which ingredients are required. The junction table should only have an entry if a certain ingredient is needed for a certain recipe.

The junction table can and should include additional data, like the amount of the ingredient that is required.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM