我正在创建一个食谱应用程序来帮助我妻子的蛋糕爱好。我们的想法是创建一个食谱数据库来保存她所有的蛋糕食谱。
每个食谱都有多种成分。每种成分都有一个测量值(gm,ml,茶匙等),然后是一个量。
我知道如何创建“配方”和“配料”表,以及如何将2与“配方配料”连接表相连接,但是我正在努力实现测量和数量字段。
有更多数据库经验的人可以建议一个数据库方案或有任何技巧来处理这个问题吗?

最佳答案

你有一些选择,像大多数事情一样,你可以走简单的路线(尼克库恩斯张贴了一个很好的例子,我正在键入这个)或逐步涉及更多的路线。以下是一些问题,您可以问自己如何看待这一点:
你的尺寸要一致吗?(你想总是显示茶匙的“tsp”,还是像尼克的例子那样是自由形式的)
您需要多久添加一次单位?你是否需要添加dram或hogshead,或其他随时间变化的单位,或者你可能只是坚持基本原则?
一个好的中间立场应该是

CREATE TABLE `recipe` (
  `recipe_id`    INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `name`         VARCHAR(128) DEFAULT NULL,
  `description`  TEXT,
  `instructions` TEXT,
  PRIMARY KEY (`recipe_id`)
)

CREATE TABLE `ingredient` (
  `ingredient_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `recipe_id`     INT(10) UNSIGNED NOT NULL,
  `ingredient`    VARCHAR(64) DEFAULT NULL,
  `amount`        DECIMAL(4, 2) DEFAULT NULL,
  `unit`          ENUM ('tsp', 'tbsp', 'oz', 'g', 'lb', 'cup', 'gallon', 'pinch') DEFAULT NULL,
  PRIMARY KEY (`ingredient_id`)
)

这通过强制一组单元来满足1,这很好。缺点是必须更改表以更新单位。它也可能更难保持你的前端与有效的选择最新。
接下来,您可以添加一个单位表,并从配料表中通过外键进行引用,如下所示:
CREATE TABLE `unit` (
  `unit_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `label`   VARCHAR(64) DEFAULT NULL,
  `sort`    INT(10) UNSIGNED NOT NULL DEFAULT 0,
  PRIMARY KEY (`unit_id`),
  UNIQUE KEY `unit_label_uk` (`label`)
)

CREATE TABLE `ingredient` (
  `ingredient_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `unit_id`       INT(10) UNSIGNED NOT NULL,
  `recipe_id`     INT(10) UNSIGNED NOT NULL,
  `ingredient`    VARCHAR(64) DEFAULT NULL,
  `amount`        DECIMAL(4, 2) DEFAULT NULL,
  `sort`          INT(10) UNSIGNED NOT NULL DEFAULT 0,
  PRIMARY KEY (`ingredient_id`)
)

这满足了1和2的要求,使您可以轻松地管理您的单元并访问列表以供前端使用,因此在更改单元时不必更改前端。
从那里你可以进入太空,提出处理单位转换的方法,等等,但这可能是你试图做的过分杀伤力。
编辑:
根据你的评论,我会这样设置:
CREATE TABLE `recipe` (
  `recipe_id`    INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `name`         VARCHAR(128) NOT NULL,
  `description`  TEXT,
  `instructions` TEXT,
  PRIMARY KEY (`recipe_id`)
)

CREATE TABLE `ingredient` (
  `ingredient_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `label`         VARCHAR(64) NOT NULL,
  `sort`          INT(10) UNSIGNED NOT NULL DEFAULT 0,
  PRIMARY KEY (`ingredient_id`)
  UNIQUE KEY `ingredient_label_uk` (`label`)
)

CREATE TABLE `unit` (
  `unit_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `label`   VARCHAR(64) DEFAULT NULL,
  `sort`    INT(10) UNSIGNED NOT NULL DEFAULT 0,
  PRIMARY KEY (`unit_id`),
  UNIQUE KEY `unit_label_uk` (`label`)
)

CREATE TABLE `recipe_ingredient` (
  `recipe_ingredient_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `recipe_id`            INT(10) UNSIGNED NOT NULL,
  `ingredient_id`        INT(10) UNSIGNED NOT NULL,
  `unit_id`              INT(10) UNSIGNED NOT NULL,
  `amount`               DECIMAL(4, 2) DEFAULT NULL,
  `sort`                 INT(10) UNSIGNED NOT NULL DEFAULT 0,
  PRIMARY KEY (`recipe_ingredient_id`)
)

你的菜谱配料表是这里的主要工作,把所有的东西都放在一起。

10-05 20:28
查看更多