配方/配料/测量/金额的数据库模式

时间:2017-08-12 22:16:03

标签: php database schema recipe directus

我正在创建一个食谱应用程序,以帮助我的妻子与她的蛋糕爱好。我们的想法是创建一个食谱数据库来保存她所有的蛋糕食谱。

每个配方都有多种成分。每种成分都有一个测量值(gm,ml,茶匙等),然后是一个数量。

我理解如何创建'食谱'和'成分'表以及如何将2与联结表'recipe_ingredients链接,但是我正在努力学习如何实现测量和数量字段。

任何拥有更多数据库经验的人都可以提出数据库方案或有任何提示来处理这个问题吗?

2 个答案:

答案 0 :(得分:4)

你有一些选择,就像大多数事情一样,你可以走简单的路线(尼克库恩发布了一个很好的例子,因为我打字这个)或逐步更多涉及的路线。以下是一些问题,您可以问自己如何看待这个问题:

  1. 您想要测量的一致性吗? (你想要总是展示" tsp"对于茶匙,或者它可以像尼克斯的例子一样自由形式)
  2. 您需要多久添加一次?你是否需要随着时间的推移添加dram或hogshead,或任何单位,或者你可能只是坚持基础?
  3. 良好的中间地带就像是

    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`)
    )
    

    你的recipe_ingredient表正在这里完成大部分工作,将所有内容捆绑在一起。

答案 1 :(得分:0)

这样的事情应该有效:

var test = new Check(1,2,1,4,1);
console.log(test);

这包含一个食谱表(每个食谱一个条目),用于保存食谱名称,描述和一组说明;一份成分表,列出可能的成分清单,包括成分的名称;以及将配方与配料相关联的交叉参考表,包括配方成分的数量和单位。