配方/成分/测量/数量的数据库架构

2023-12-22

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

每个食谱都有多种成分。每种成分都有一个测量值(克、毫升、茶匙等),然后是数量。

我了解如何创建“食谱”和“成分”表,以及如何将这两个表与连接表“recipe_ingredients”链接起来,但是我正在努力解决如何实现测量和金额字段。

任何有更多数据库经验的人都可以建议数据库方案或有任何技巧来处理这个问题吗?


为此,您有一些选择,并且像大多数事情一样,您可以走简单的路线(尼克·库恩斯在我输入此内容时发布了一个很好的示例)或逐渐涉及更多的路线。以下是一些关于您如何看待这项工作的问题:

  1. 您希望测量结果保持一致吗? (您是否希望始终显示“tsp”代表茶匙,或者可以像尼克的示例一样自由形式)
  2. 您需要多久添加一次单位?随着时间的推移,您是否需要添加 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`)
)

这通过强制执行一组单元来满足第一条要求,这很好。缺点是您必须更改表才能更新单位。让前端保持最新的有效选择也可能更困难。

接下来,您可以添加一个单位表,并通过成分表中的外键引用它,如下所示:

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 表在这里完成了大部分工作,将所有内容连接在一起。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

配方/成分/测量/数量的数据库架构 的相关文章

  • 垃圾邮件打败了我所有的验证码

    我有一个 WordPress 博客 我在上面使用验证码插件的时间最长 因为它有效 最近我收到了大量的垃圾邮件 然后我尝试执行通过 PHP 生成的 将这些随机数添加在一起 但仍然没有成功 我不太确定需要做什么来阻止这些垃圾邮件 但这很烦人 我
  • MySQL 和 PHP 参数 1 作为资源

    好吧 当我运行下面提到的代码时 PHP 向我抛出此错误 在日志中 Error mysql num rows 期望参数 1 为资源 第 10 行 place 中给出的字符串 9 11号线 queryFP SELECT FROM db coun
  • postgresql 不同的不工作

    我使用以下代码从数据库获取值 但是当我编写这段代码时 测试看看问题出在哪里 我注意到查询没有从数据库中获取不同的值 这是查询 select distinct ca id as id acc name as accName pIsu name
  • 如何在 CakePHP 中“验证”人名?

    我有一个 PHP 脚本 应该检查 有效 的人名 但最近破解了带有空格的名称 因此我们向验证器添加了空格 除了这样做之外 有没有办法向 CakePHP 的验证器添加黑名单以阻止所有 无效 字符 而不是允许 有效 字符 注意 我 通常 知道如何
  • php中的$$是什么意思? [复制]

    这个问题在这里已经有答案了 变量后面的两个背对背 是什么意思 像这样 id 我在哪里可以找到更多相关信息 谢谢 In PHP 意味着您将给至少一名维护程序员带来多年的痛苦和折磨 请注意 您最终可能会成为维护程序员 它是一个可变变量 想象一下
  • file_get_contents 大文件上传

    我正在尝试使用 fsockopen 上传 2GB 以上的大文件 但 file get content 出现以下错误 我无法在内存中存储大文件 我需要分块发送数据 但不知道如何执行此操作 请问有人可以指导我吗 致命错误 允许的内存大小 134
  • 在 Laravel 中的编辑表单上获取选定选项

    我的网站订单有一个可编辑的表单 并且有以下字段 User quantity note status 我在此表单中还有其他选项 但只有这些字段对我来说很重要 以便能够获取默认值 例如 我希望能够查看用户默认订购的数量 然后我可以更改它或保留它
  • Zend Framework 中的动态默认模块

    有谁知道在 Zend Framework 中动态设置默认模块并且不会遇到命名空间问题的方法 例如 我想要做的是有一个允许加载的模块表 其中一个设置为默认模块 例如 我可能有 admin blog calendar 作为可以加载的模块 如果我
  • 将数据库与 Clojure 结合使用

    有哪些使用 Clojure 数据库的方法 我从 Clojure 知道你可以用 Java 做任何事情 但这意味着我最终可能会使用一些过于复杂的东西 比如 Hibernate 这与 Clojure 的简单性相冲突 有什么建议或意见吗 Cloju
  • Cakedc.users => 总是重定向到主页

    我在新的 Cakephp 安装上使用插件 CakeDC Users 我有两个控制器 PagesController php CardsController php Pages 有 1 个操作 Beta 它是主页 Cards 有两个操作 索引
  • 显示和随机化 php 数组

    我有一个显示结果的数组 如下所示 Array 0 gt 71 1 gt 56 2 gt 64 3 gt 82 4 gt 90 5 gt 80 6 gt 65 7 gt 62 8 gt 14 9 gt 3 我的代码是 while row my
  • 从 php 执行 bash 脚本并立即输出回网页

    我有一组 bash 和 Perl 脚本 开发在 Linux Box 上部署所需的目录结构 可选 从svn导出代码 从这个源构建一个包 这在终端上运行良好 现在 我的客户请求此流程的 Web 界面 例如 某些页面上的 创建新包 按钮将一一调用
  • json_encode 返回 NULL?

    由于某种原因 项目 描述 返回NULL使用以下代码 这是我的数据库的架构 CREATE TABLE staff id int 11 NOT NULL AUTO INCREMENT name longtext COLL
  • php oracle客户端oci8安装出现什么问题

    我尝试了安装 PHP Oracle 客户端的所有过程 1 我安装了客户端版本8和32位 2 我在php ini中取消了oci的注释 3 重新启动Wamp 4 不确定是否真的安装 但我在 php ini 中得到了引用 5 但仍然无法连接 泰汉
  • 扩展构建器中的“映射到现有表”显示 TYPO3 中的奇怪问题

    在我的扩展中MyExt 我映射了模型Page to pagesTYPO3 中的表 首先它向我展示了type mismatch错误 无论如何我继续保存它 会发生以下情况 我的页面树变成这样 我的新记录表单仅显示 UID 而不显示标题 My P
  • SQLite 仅当值不为空时更新列

    Query UPDATE item table SET field1 field1 spanish field2 field2 spanish 问题 我怎样才能更新field1 with field1 spanish ONLY if fie
  • 使用 MYSQL 将 h:mm pm/am 时间格式插入数据库

    我正在尝试将以 h mm am pm 格式写入的时间插入到存储为标准 DATETIME 格式 hh mm ss 的数据库中 但我不知道如何将发布的时间转换为标准格式所以数据库会接受它 这是我到目前为止一直在尝试的 title POST in
  • MySQL 概念:会话与连接

    我对 MySQL 的概念有点困惑 会话与连接 当谈论连接到 MySQL 时 我们使用连接术语 连接池等 然而在 MySQL 在线文档中 http dev mysql com doc refman 4 1 en server system v
  • 禁用 WooCommerce 手动/编辑订单的电子邮件通知

    需要 WooCommerce 专业知识 我需要禁用手动创建的订单的电子邮件通知 我必须使用处理状态 由于处理订单状态的自定义挂钩 我无法创建自定义状态 理想情况下 手动订单页面中可以勾选一个复选框 勾选后 它将禁止在每种状态下向客户发送电子
  • 如何将变量插入 PHP 数组?

    我在网上查了一些答案 但都不是很准确 我希望能够做到这一点 id result id info array id Example echo info 0 这有可能吗 您需要的是 不推荐 info array id Example varia

随机推荐

  • Spring JDBC:如何创建表?

    我正在使用春天JdbcTemplate使用 DAO 模式来访问数据库 我正在寻找一种在 DAO 层中生成表的方法 而不是手动创建数据库表 我明白我可以使用JdbcTemplate要执行语句 我只是在寻找正确的位置来执行它 有没有最佳实践 您
  • IntelliJ可以在同一个tomcat实例上调试两个war文件吗?

    我有两个 Web 应用程序 每个应用程序都会生成一个 war 文件 有时我需要同时运行和调试它们 我今天实现这一目标的方法是在 tomcat 6 的端口 8080 上运行项目 A 在 tomcat 7 的端口 8181 上运行项目 B 我有
  • 如果 getter 抛出异常,如何让 Jackson 忽略属性

    我有很多来自供应商的类 它们喜欢在属性访问时随机抛出运行时异常 public Object getSomeProperty if someObscureStateCheck throw new IllegalStateExcepion re
  • C++ 中优先级队列的时间复杂度

    创建堆需要O n 插入堆 或优先级队列 所需的时间O log n time 获取 n 个输入并将它们插入优先级队列 该操作的时间复杂度是多少 O n 或 O n log n 另外 如果也清空整个堆 即 n 删除 也会得到相同的结果 对吗 如
  • 如何使用 pack 或 grid 实现以下 Tkinter GUI 布局?

    这是我当前的跳棋游戏 GUI 布局 正如您所看到的 它由顶部的菜单 左侧的画布 用于绘制棋盘 右上角的工具栏 框架 其中有各种格式 导航按钮 以及使用的文本小部件组成 来注释动作 目前 我正在为小部件使用网格布局 这是我需要做的 当文本量大
  • ReferenceEquals(variable, null) 与variable == null 相同吗?

    基本上就是标题 我在我正在编写的代码中看到很多前者 我想知道为什么他们不使用后者 两者之间有什么区别吗 Thanks 直接来自文档 http msdn microsoft com en us library system object re
  • 适用于 Windows 8 RTM 的 Microsoft Advertising SDK 导致访问被拒绝错误

    请注意以下事项 我有 Windows 8 RTM 我有 Visual Studio 2012 RTM 我有 Microsoft Advertising SDK RTM 我所做的就是 添加对它的引用 错误 System Unauthorize
  • App Engine 数据存储上的 Spring Security ACL

    我们将 Spring Security ACL 基础设施与 App Engine 数据存储结合使用 我们不使用低级数据存储 API 而是使用 Objectify 框架来访问数据存储 我们需要将Spring Security ACL模型 适用
  • 通过 php exec 函数传递 $_SERVER 数组[重复]

    这个问题在这里已经有答案了 可能的重复 安全执行shell脚本 执行前转义变量 https stackoverflow com questions 2624616 safe executing shell scripts escaping
  • 谷歌地图API带有信息窗口的多个标记

    我刚刚开始接触谷歌地图 API 我正在尝试在地图上绘制几个标记 完毕 然而 我正在为每个标记回收一个变量 对象 我最初使用选项创建标记并添加到地图 然后采用相同的标记变量 重新调整其用途 然后再次将其添加到地图 这确实会产生两个带有单独标题
  • 你将如何在 C# 中构建这个 xml

    我需要生成这个看起来简单的 XML 寻找一种干净的方法来生成它
  • 从 NPM 包中导出多个模块

    我有一个相当大的项目 A 使用 Node 和 Typescript 在项目 A 中 我有很多不同的模块 我想在另一个项目 B 中重用它们 因此我用这个 tsconfig json 构建了项目 A compilerOptions target
  • Android 应用内计费 - 从服务器检索信息时出错

    我在应用程序计费中使用 Android 来进行应用程序内购买 在极少数情况下 我的许多用户都会报告此错误 从服务器检索信息时出错 RPC S 7 AEC 0 这是在生产中发生的 而不是在测试中发生的 我无法在本地重现此内容以进行调试 这个错
  • ArrayDeque类的addFirst方法

    java util ArrayDeque类中addFirst方法的代码是 public void addFirst E e if e null throw new NullPointerException elements head hea
  • 使用 1-1 函数从 id 生成代码

    有没有好的可逆 1 1 函数将一个整数映射到另一个整数 例如 给定范围 0 5 我想找到一个映射的 0 gt 3 1 gt 2 2 gt 4 3 gt 5 4 gt 1 5 gt 0 此外 映射应该看起来是随机的 您可以按升序填充数组并对其
  • 使用 Laravel 查询生成器和 LEFT JOIN 删除行

    如何在一个查询中从多个表中删除行 使用左连接 查询 DELETE deadline job FROM deadline LEFT JOIN job 所以 我尝试这样 DB table deadline job gt leftJoin job
  • 下载文件时显示“请稍候”消息或进度条

    我使用以下 WordPress 管理员通知来提示用户下载一些文件 我想在下载文件时包含一个进度条或至少包含一个 正在下载 请稍候 消息 有任何想法吗 我已经尝试了几种 jQuery 解决方案 但没有任何效果 对于 jQuery 我完全是个菜
  • 非静态字段、方法或属性需要对象引用吗?

    我知道这可能是一个非常新的问题 所以我很抱歉 我正在尝试从另一个表单 MaxScore 访问 Form1 上标签的 Text 属性 当我单击 MaxScore 上的 确定 按钮时 我想使用 max ToString 将 Form1 的 my
  • 如何直接从我的服务器将视频上传到 Youtube?

    我正在设置一个 无头 网络服务器 让人们可以制作自己的自定义延时电影 有几个人想将他们制作的延时视频上传到 YouTube 与其将视频下载到该人的笔记本电脑上 然后该人手动将其上传到 YouTube 有没有一种方法可以在我的网络服务器上编写
  • 配方/成分/测量/数量的数据库架构

    我正在创建一个食谱应用程序来帮助我妻子实现她的蛋糕爱好 这个想法是创建一个食谱数据库来保存她所有的蛋糕食谱 每个食谱都有多种成分 每种成分都有一个测量值 克 毫升 茶匙等 然后是数量 我了解如何创建 食谱 和 成分 表 以及如何将这两个表与