蛋糕配方的 SQL 架构和成分列表

san*_*ayr 0 sql postgresql

我是 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,
);

Run Code Online (Sandbox Code Playgroud)

编辑:所以假设我在成分表中有这个:

(1, flour, 40)
(2, eggs, 12)
(3, sugar, 23)
Run Code Online (Sandbox Code Playgroud)

这在食谱表中:

(1, cake, "3 flour, 4 eggs, 2 sugar")
Run Code Online (Sandbox Code Playgroud)

我对如何链接这两个表有点困惑。


list_of_ingredients 需要引用成分表作为外键。我知道 NoSQL DB 的全部意义在于允许列表,所以我不确定我是否完全错误地处理了这个问题。

我还将编写一个 Make_Recipe 函数,该函数将接收一个配方并确保有足够的成分,如果通过上述条件,则继续并减少成分数量。

我已经通读了这些帖子,但它们不太符合要求: 用于存储食物食谱的 数据库设计食谱/成分/测量/数量的数据库架构

谢谢你的时间!任何帮助深表感谢。

Zoh*_*led 5

食谱和成分之间的关​​系是所谓的多对多关系——一个食谱可能包含任意数量的成分,而一个成分可能被任意数量的食谱使用。

在关系型数据库(而PostgreSql是关系型数据库)中,创建多对多关系的方式是引入桥表。

在食谱和配料的情况下,您将拥有三张桌子。
一张成分表,指定成分的名称(可能还有其他与成分相关的数据,如果您能想到此类数据)。另一个菜谱表,指定菜谱名称、描述、文本解释等,以及菜的大小。然后你有桥表,成分到食谱,它将包含一个到配方表的一对多外键,一个到成分表的一对多外键,以及该特定配方中该特定成分所需的数量.

还记得食谱表中菜的大小吗?当按比例放大或缩小菜肴的大小时,需要计算成分数量的放大或缩小。

因此,这些表的 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)
);
Run Code Online (Sandbox Code Playgroud)