蛋糕配方的SQL模式和配料表

时间:2019-07-18 18:30:21

标签: 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,
);


编辑: 假设我在配料表中有这个

(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

感谢您的时间!非常感谢您的帮助。

1 个答案:

答案 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)
);