设计需要包含成分和子配方的配方数据库

Vin*_*ceL 14 mysql database-design

我正在设计一个需要非常灵活的配方数据库,因为它将直接与我们的后台库存系统进行通信.这是我到目前为止关于表格的内容:

  • 食谱:此表将包含食谱日期:名称,烹饪所需的步骤等.
  • 成分/库存:这是我们的库存,所以这将包含我们的食谱中将使用的每个产品的信息.
  • 食谱行项目:这是一个棘手的表,我想能够链接到这里的成分以及食谱所需的数量,但我还需要能够直接包括食谱表中的食谱(如marinara酱)我们在内部制作,这就是为什么我无法找出设计这张桌子的最佳方法.

基本上,配方行项目表需要能够链接到成分表或配方表,具体取决于需要哪个行项目,我想知道什么是最有效的处理方式.

非常感谢你提前!

Bra*_*vic 7

看起来你需要一个类似于这个的数据库模型:

在此输入图像描述

此模型具有以下属性:

  • 基本上,每个配方都是一系列步骤.
  • 每个步骤都有相对于相同配方(STEP_NO)的其他步骤的顺序,单位(质量,体积,计数......),该单位中的数量等.
  • 特定步骤连接到一个成分(当INGREDIENT_ID为非NULL时)或另一个配方(当SUBRECIPE_ID为非NULL时).1
  • 除此之外,步骤是执行许多一对多的关系,这意味着相同的成分可以在多个食谱(或甚至相同的配方的多个步骤)中使用,并且还配方可以是一个"子相当标准的联接表-recipe"的其他多个食谱.
  • 这基本上是有向图.数据模型本身不会阻止循环 - 它们应该在客户端代码级别避免,并且可能由触发器检测到.

1如果MySQL支持CHECK约束(它没有),你可以确保它们中的一个(但不是两个)非NULL,如下所示:

CHECK (
    (INGREDIENT_ID IS NULL AND SUBRECIPE_ID IS NOT NULL)
    OR (INGREDIENT_ID IS NOT NULL AND SUBRECIPE_ID IS NULL)
)
Run Code Online (Sandbox Code Playgroud)

就目前而言,你需要一个触发器.


Mar*_*ean 0

您\xe2\x80\x99将需要三个表:一个recipes表、一个ingredients表和一个recipe_ingredients将成分分配给配方的表。您还可以在此表中存储其他信息,例如数量。例如,如果您有蔬菜汤的食谱,您将有多个具有相应数量的蔬菜条目。然后,这些条目将通过外键链接到相关的配方和成分。

\n\n

编辑:最简单的模式:

\n\n
CREATE TABLE `ingredients` (\n  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,\n  `name` varchar(45) NOT NULL,\n  PRIMARY KEY (`id`)\n) TYPE=InnoDB;\n\nCREATE TABLE `recipes` (\n  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,\n  `name` varchar(45) NOT NULL,\n  PRIMARY KEY (`id`)\n) TYPE=InnoDB;\n\nCREATE TABLE `recipe_ingredients` (\n  `recipe_id` int(10) unsigned NOT NULL,\n  `ingredient_id` int(10) unsigned NOT NULL,\n  `quantity` int(10) unsigned NOT NULL,\n  KEY `recipe_id` (`recipe_id`),\n  KEY `ingredient_id` (`ingredient_id`)\n) TYPE=InnoDB;\n\n\nALTER TABLE `recipe_ingredients`\n  ADD CONSTRAINT `recipe_ingredients_ibfk_2` FOREIGN KEY (`ingredient_id`) REFERENCES `ingredients` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,\n  ADD CONSTRAINT `recipe_ingredients_ibfk_1` FOREIGN KEY (`recipe_id`) REFERENCES `recipes` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;\n
Run Code Online (Sandbox Code Playgroud)\n