Обновление данных таблицы, где несколько строк могли устареть

У меня есть приложение, в котором я могу создавать и редактировать рецепты, состоящие из ингредиентов и их количества. Эта информация должна храниться в реляционной базе данных (вероятно, MySQL или SQLite). У меня есть таблица, в которой хранятся рецепты с первичным ключом auto_increment, и другая таблица, в которой я сохраняю ингредиенты и количества, ссылаясь на первую таблицу через ограничение внешнего ключа.

Теперь я хочу написать код обновления внутри своего приложения. Я сохраняю идентификатор рецепта в своих объектах рецепта, поэтому я могу легко ссылаться на него. Но как мне правильно обновить ингредиенты и количество? Несколько строк второй таблицы, возможно, устарели и должны быть удалены, а некоторые просто необходимо обновить (при изменении суммы).

Самым простым решением, которое я придумал, было бы просто удалить все строки, относящиеся к моему текущему рецепту, и снова вставить их. Является ли это приемлемым подходом или существует шаблон/лучшая практика для такого рода проблем?


Примечание. Я знаю, что могу просто сохранить ингредиенты и количество в списке строк varchar, но я хотел бы работать с какой-то структурой таблицы.


Изменить: Таблицы CREATE code:

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

person Luca Fülbier    schedule 22.02.2016    source источник
comment
Покажите нам какой-нибудь код, который вы пробовали, и дайте нам пример данных таблицы, пожалуйста.   -  person dfundako    schedule 22.02.2016
comment
Что вы используете для бизнес-уровня вашего кода? Язык программирования, фреймворк и т.д.?   -  person Tom H    schedule 22.02.2016
comment
@dfundako Я еще ничего не пробовал, но у меня был проект на моей подработке, где я использовал стратегию удаления всего и повторной вставки, и это сработало, но я чувствую, что должен быть более эффективный способ. Добавлен код создания таблиц.   -  person Luca Fülbier    schedule 22.02.2016
comment
@TomH Я использую Python с PyMySQL, без фреймворка   -  person Luca Fülbier    schedule 22.02.2016


Ответы (1)


Добавьте первичный ключ auto_increment в таблицу ингредиентов. Затем, когда ваше приложение выпускает обновление, вы можете определить, какой ингредиент обновляется по его первичному ключу.

Я бы добавил ПК следующим образом:

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

В своем пользовательском интерфейсе вы будете перебирать ингредиенты и отображать их в отдельных строках, при этом идентификатор ингредиента будет связан с каждой строкой. Это может выглядеть примерно так:

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

Теперь, если пользователь редактирует или удаляет строку соли, вы знаете, что это был ингредиент с идентификатором 1, и вы можете идентифицировать его в своей базе данных.

person Jerrad    schedule 22.02.2016
comment
Я не совсем понимаю этот ответ. Должен ли я создать еще одну таблицу ingredient или просто добавить ключ идентификатора auto_increment в существующую таблицу recipe_ingredient? Как бы вы сохранили это в приложении? Создать другой класс/структуру для хранения информации об ингредиентах или просто сохранить всю информацию в списке (например, [имя_ингредиента, количество, единица измерения, db_id])? - person Luca Fülbier; 22.02.2016
comment
Добавьте ключ идентификатора auto_increment в существующую таблицу recipe_ingredient. Как работает ваше приложение? Я предположил, что вы извлекаете свой список ингредиентов и отображаете его пользователю в какой-то таблице (которая может включать ключ ингредиента). Вы делаете что-то более простое, например, просто предлагаете пользователю ввести ингредиенты в одно текстовое поле и разбирать ингредиенты по строкам? - person Jerrad; 22.02.2016
comment
У меня еще нет пользовательского интерфейса, я просто пытаюсь научиться правильно проектировать программное обеспечение, создавая мое приложение снизу. Идея состоит в том, чтобы пользователь вводил ингредиенты через текстовые поля по одному. Они хранятся в словаре, поэтому я могу довольно легко искать рецепты с конкретными ингредиентами, ключом является название ингредиента, а значением является кортеж количества, единицы измерения и другой информации, которая мне нужна. - person Luca Fülbier; 22.02.2016