Эффективный способ обновить таблицу SQL-отношений - PullRequest
3 голосов
/ 15 июня 2010

Скажем, у меня есть три правильно нормализованных таблицы. Один из людей, один из квалификаций и один отображающий людей на квалификации:

Люди:

id | Name
----------
1  | Alice
2  | Bob

градусы:

id | Name
---------
1  | PhD
2  | MA

Люди к степени:

person_id | degree_id
---------------------
1         | 2         # Alice has an MA
2         | 1         # Bob has a PhD

Итак, я должен обновить это отображение через мой веб-интерфейс. (Я ошибся. У Боба есть степень бакалавра, а не докторская степень, а Алиса только что получила степень бакалавра.)

Существует четыре возможных состояния этих отображений отношений один-ко-многим:

  • был истинным раньше, теперь должен быть ложным
  • раньше был ложным, теперь должен быть истинным
  • был правдой раньше, должен оставаться верным
  • был ложным раньше, должен оставаться ложным

что я не хочу делать, так это читать значения из четырех флажков, а затем нажимать на базу данных четыре раза, чтобы сказать: «У Боба была БА раньше? «У Боба была докторская степень раньше? Потому что он больше не имеет» и так далее.

Как другие люди решают эту проблему?

Мне любопытно посмотреть, придет ли кто-то еще к тому же решению, что и я.

ОБНОВЛЕНИЕ 1 : onedaywhen предлагает то же самое, что произошло со мной - просто удалите все старые записи, исправить или нет, и ВСТАВИТЬ новые.

ОБНОВЛЕНИЕ 2 : potatopeelings предлагает добавить в форму некоторый код, в котором хранится исходное значение поля, которое можно сравнить с новым значением при отправке.

Ответы [ 2 ]

2 голосов
/ 15 июня 2010

Логически UPDATE - это DELETE, за которым следует INSERT (учтите, что триггеры SQL Server могут обращаться к логическим таблицам с именами inserted и deleted, но таблицы updated нет). Таким образом, вы должны быть в состоянии попасть в базу данных только дважды, то есть сначала DELETE все строки (правильные или нет) для Боба, затем INSERT все правильные строки для Боба.

Если вы хотите использовать базу данных только один раз, рассмотрите возможность использования стандартного SQL MERGE, предполагая, что ваша СУБД поддерживает его (SQL Server представил его в 2008 году).

0 голосов
/ 15 июня 2010

Предполагая, что пользовательский интерфейс является сеткой флажков (1. в комментарии Ismail в вопросе)

           MA      PhD    
Alice      x 
Bob                 x

, где x представляет флажки.Я бы пошел с использованием сценария переднего плана для отправки только изменений обратно на сервер.Затем выполняйте INSERT и DELETE в People-to-степени в рамках одной транзакции или MERGE (как указано в ссылке Ismail)удостоверение личности людей, пары степени ID, как.Для вашего примера запрос INSERT будет одной парой (2,2), а для запроса DELETE - одной парой (2,1).

...