我有一个应用程序,我可以创建和编辑由成分及其数量组成的食谱。该信息应该保存在关系数据库(可能是MySQL或SQLite)中。我有一个存储配方的表,其中包含auto_increment主键和另一个表,其中我保存了成分和数量,通过外键约束引用第一个表。
现在我想在我的应用程序中编写更新代码。我在食谱对象中保存了食谱ID,所以我可以很容易地引用它。但我如何正确更新成分和数量?第二个表的多行可能已经过时,必须删除,有些只需要更新(当金额更改时)。
我提出的最简单的解决方案是删除所有涉及我当前配方的行并重新插入它们。这是一种可接受的方法,还是存在这种问题的模式/最佳实践?
注意:我知道我可以在varchar stringlist中保存成分和数量,但我想使用某种表结构。
编辑:表格CREATE代码:
CREATE TABLE `recipe` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(30) NOT NULL
PRIMARY KEY (`id`)
)
CREATE TABLE `recipe_ingredients` (
`recipe_id` INT(11) NOT NULL,
`ingredient` VARCHAR(30) NOT NULL,
`amount` FLOAT NOT NULL,
`measurement_unit` VARCHAR(10) NOT NULL,
INDEX `recipe_id` (`recipe_id`),
CONSTRAINT `recipe_ingredients_ibfk_1` FOREIGN KEY (`recipe_id`) REFERENCES `recipe` (`id`),
CONSTRAINT `recipe_ingredients_ibfk_2` FOREIGN KEY (`recipe_id`) REFERENCES `recipe` (`id`)
)
答案 0 :(得分:1)
将auto_increment主键添加到配料表中。然后,当您的应用程序发布更新时,您可以通过其主键识别正在更新的成分。
我会像这样添加PK:
CREATE TABLE `recipe_ingredients` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`recipe_id` INT(11) NOT NULL,
`ingredient` VARCHAR(30) NOT NULL,
`amount` FLOAT NOT NULL,
`measurement_unit` VARCHAR(10) NOT NULL,
PRIMARY KEY (`id`)
INDEX `recipe_id` (`recipe_id`),
CONSTRAINT `recipe_ingredients_ibfk_1` FOREIGN KEY (`recipe_id`) REFERENCES `recipe` (`id`),
)
在您的用户界面中,您将遍历各个成分并将它们显示在不同的行上,其中成分ID与每行相关联。它可能看起来像这样:
<table>
<thead>
<tr>
<th>Ingredient</th>
<th>Amount</th>
<th>Units</th>
</tr>
</thead>
<tdata>
<tr>
<td>
<input type='hidden' id='ingredient1_id' value='1' />
<input type='text' id='ingredient1_name' value="salt" />
</td>
<td>
<input type='text' id='ingredient1_amount' value="2" />
</td>
<td>
<input type='text' id='ingredient1_unit' value="tsp" />
</td>
</tr>
<tr>
<td>
<input type='hidden' id='ingredient2_id' value='2' />
<input type='text' id='ingredient2_name' value="flour" />
</td>
<td>
<input type='text' id='ingredient2_amount' value="3" />
</td>
<td>
<input type='text' id='ingredient2_unit' value="cups" />
</td>
</tr>
</tdata>
</table>
现在,如果用户编辑或删除了盐行,您知道它是ID为1的成分,您可以在数据库中识别它。