我正在开发一个食谱应用程序来帮助我妻子培养她的蛋糕爱好。这个想法是创建一个食谱数据库来保存她所有的蛋糕食谱。
每个食谱都有多种成分。每种成分都会有测量值(克、毫升、茶匙等),然后是数量。
我了解如何创建“食谱”和“成分”表以及如何将这 2 个表与联结表“recipe_ingredients”相关联,但是我正在为如何实现测量和数量字段而苦苦挣扎。
有更多数据库经验的人可以建议数据库方案或有任何提示来处理这个问题吗?
最佳答案
对此您有一些选择,并且像大多数事情一样,您可以走简单的路线(Nick Coons 在我输入这篇文章时发布了一个很好的例子)或逐渐复杂的路线。这里有一些关于您如何看待此工作的问题要问自己:
- 您想要测量结果的一致性吗? (你想始终为茶匙显示“tsp”,还是像 Nick 的例子那样自由显示)
- 您需要多久添加一次单位?随着时间的推移,您是否需要添加 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`)
)
您的 recipe_ingredient 表在这里完成大部分工作,将所有内容联系在一起。
关于php - 配方/成分/测量/数量的数据库模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45655382/