【问题标题】:SQL schema and ingredients list for cake recipe蛋糕食谱的 SQL 模式和成分列表
【发布时间】:2019-07-20 12:09:30
【问题描述】:

我是 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 DB 的全部意义在于允许列表,所以我不确定我是否完全错误地处理了这个问题。

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

我已经阅读了这些帖子,但它们并不完全符合要求: Database design for storing food recipes Database Schema for Recipe/Ingredient/Measurement/Amount

感谢您的宝贵时间!非常感谢任何帮助。

【问题讨论】:

标签: sql postgresql


【解决方案1】:

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

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

对于食谱和配料,您将拥有三张表。
一张成分表,指定成分的名称(可能还有其他成分相关的数据,如果你能想到这样的数据)。 另一个菜谱表,指定菜谱的名称、描述、文字说明等,以及菜的大小。 然后你有一个桥接表,componentToRecipe,它将包含配方表的一对多外键、成分表的一对多外键以及该特定配方中该特定成分所需的数量.

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

因此,这些表的 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)
);

【讨论】:

  • 这会不会导致任何问题,因为在 ingredientsToRecipes 中没有 PRIMARY KEY?还是用 2 个外键代替主键?
  • 对不起,我不知何故错过了桥接表中的主键。编辑在 - 两个外键的组合是表的主键。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-04
相关资源
最近更新 更多