更新 table 多行可能已过时的数据

Updating table data where multiple rows might have become obsolete

我有一个应用程序,我可以在其中创建和编辑由成分及其数量组成的食谱。此信息应该保存在关系数据库中(可能是 MySQL 或 SQLite)。我有一个 table 存储食谱,其中有一个 auto_increment 主键和另一个 table 我保存成分和数量的地方,通过外键约束引用第一个 table。

现在我想在我的应用程序中编写更新代码。我将食谱 ID 保存在我的食谱对象中,因此我可以很容易地引用它。但是我如何正确更新成分和数量?第二个 table 的多行可能已经过时,必须删除,有些只需要更新(当数量更改时)。

我想出的最简单的解决方案就是删除所有引用我当前食谱的行并重新插入它们。这是一个acceptable的方法,还是有一个pattern/best-practice来解决这种问题?


注意:我知道我可以将成分和数量保存在 varchar 字符串列表中,但我想使用某种 table 结构。


编辑: tables 创建代码:

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

为您的成分 table 添加一个 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`),    
)

在您的 UI 中,您将遍历成分并将它们显示在单独的行中,成分 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 的成分,并且您可以在数据库中识别它。