UPDATE или DELETE сначала, затем INSERT

Я спрашиваю об этом еще раз, потому что я не могу получить прямой ответ от других вопросов о SO.

Моя ситуация следующая: две таблицы, phones и features .

Состав:

телефоны

  • Я бы
  • Brand_ID
  • модель
  • картина
  • опубликованный

функции

  • Я бы
  • phone_id
  • особенность

Теперь features содержат множество значений, которые только между 1 и 4 будут соответствовать определенному телефону через phone_id .

Теперь, когда я обновляю функции, считаете ли вы, что удаление и добавление новых функций снова или обновление существующих функций будет лучше?

// редактировать:

скидки

  • Я бы*
  • phone_id
  • contract_id
  • start_publish
  • finish_publish
  • опубликованный

контракт

  • Я бы*
  • имя
  • выгода
  • продолжительность
  • цена и т. д.

марка

  • Я бы
  • имя
  • логотип

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

// редактируем 2:

Ох, и только отдельные функции телефона будут удалены / обновлены за раз, а также только 1-4 функции будут удалены за раз. Кроме того, функции всегда могут быть более или менее и никогда не иметь заданного числа.

Если количество функций на телефоне будет когда-либо изменено, вы должны удалить и вставить. Для обновления вам необходимо:

  • получить текущий набор функций
  • выяснить, что отличает, что было добавлено, и что было удалено
  • запускать запросы для обновления, вставлять новые данные и удалять старые данные.

Если вы просто удаляете весь список и повторно вставляете их, вы сохраняете некоторые головные боли в обслуживании.

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

Возьмем следующий пример:

У меня есть блог с Posts(id, title, body) и Categories(id, post_id, category) . Мой первый пост «Hello World» относится к категории «мета, php и javascript». Затем через год я пересматриваю сообщение, чтобы иметь некоторую информацию о mysql (или я добавляю категорию mysql) и вынимаю javascript.

Вот что мне нужно сделать (в основном psuedocode):

 //old set SELECT * FROM Categories WHERE post_id=1 foreach($categories as $category) { if(in_array($category['id'], $_POST['categories']) { //this category is in the new set and the old set, do nothing } elseif(!in_array($category['id'], $_POST['categories']) { //this category is in the old set, but not the new one, delete it $queries[] = "DELETE FROM Categories WHERE id=".$category['id']; } else { //new category, add it $queries[] = "INSERT INTO Categories()..." } } foreach($queries as $item) { //run query } 

В сравнении с этим:

 DELETE FROM Categories WHERE post_id=$_POST['id'] foreach($_POST['categories'] as $item) { INSERT INTO Categories() ... } 

Лично я считаю, что вариант №2 лучше.

Когда вы «обновляете функции», вы делаете именно это, update .

Необходимо использовать UPDATE. Кроме того, удаление и вставка могут выполняться в одной команде REPLACE.

http://dev.mysql.com/doc/refman/5.0/en/replace.html

Кроме того, если функции могут быть разделены (отношения многих или многих), вы можете захотеть рассмотреть третью таблицу, которая связывает только идентификаторы телефонов с идентификаторами.