我是PostgreSql的新手,并且正在研究示例数据库以进行学习。我有一个面包店数据库,一个配方表和一个成分表。我正在尝试理解连接两个表的架构,以便配方表具有引用该成分表的成分列表,但是我不确定是否需要第三个表,还是只能摆脱这两个表
CREATE TABLE ingredients
(
ing_id SERIAL PRIMARY KEY,
name varchar(255) NOT NULL,
quantity integer NOT NULL
);
CREATE TABLE recipes
(
rec_id SERIAL PRIMARY KEY,
name varchar(120) NOT NULL,
list_of_ingredients text NOT NULL,
);
编辑: 假设我在配料表中有这个
(1, flour, 40)
(2, eggs, 12)
(3, sugar, 23)
这在食谱表中:
(1, cake, "3 flour, 4 eggs, 2 sugar")
我对如何链接两个表有些困惑。
list_of_ingredients将需要将成分表作为外键引用。我知道NoSQL数据库的全部目的是允许使用列表,所以我不确定我是否完全错误了。
我还将编写一个Make_Recipe函数,该函数将接收一个配方并确保有足够的配料,然后继续进行,并在达到上述条件时减少配料数量。
我已经阅读了这些帖子,但它们与要求不符: Database design for storing food recipes Database Schema for Recipe/Ingredient/Measurement/Amount
感谢您的时间!非常感谢您的帮助。
答案 0 :(得分:2)
食谱和配料之间的关系是所谓的多对多关系-食谱可以包含任意数量的配料,而配料可以被任意数量的食谱使用。
在关系数据库(而PostgreSql是关系数据库)中,创建多对多关系的方法是引入桥表。
对于食谱和食材,您将拥有三个表格。
一个成分表,指定成分的名称(以及其他可能与成分相关的数据,如果可以想到的话)。
另一个用于配方的表,用于指定配方的名称,描述,文字说明等,以及菜的大小。
然后,您有一个桥接表IngredientToRecipe,其中将包含配方表的一对多外键,成分表的一对多外键以及该特定配方中该特定成分所需的数量。
在菜谱表中还记得菜的大小吗?在放大或缩小碟子尺寸时需要用此来计算放大或缩小配料数量。
因此,这些表的DDL可能看起来像这样:
CREATE TABLE ingredients
(
ing_id SERIAL PRIMARY KEY,
name varchar(255) NOT NULL
);
CREATE TABLE recipes
(
rec_id SERIAL PRIMARY KEY,
name varchar(120) NOT NULL,
description text NOT NULL,
DishSize integer NOT NULL
);
CREATE TABLE ingredientsToRecipes
(
rec_Id integer REFERENCES recipes (rec_id),
ing_id integer REFERENCES ingredients (ing_id),
quantity integer NOT NULL,
quantity_unit varchar(100) NOT NULL,
PRIMARY KEY(rec_Id, ing_id)
);