2010-06-15 4 views
3

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

Люди:

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 

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

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

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

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

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

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

UPDATE 1: onedaywhen предлагает то же самое, что произошло со мной - просто удалить все старые записи, правильно или нет, и вставить новые

UPDATE 2: potatopeelings предлагает добавить некоторый код в форму, которая хранит. первоначальное значение поле, которое можно сравнить с новым значением для submit.

+1

что такое элементы управления на вашем веб-интерфейсе? Все флажки для значений в таблице «Люди и градусы»? Это одно обновление для одного человека? – IsmailS

+0

Вы можете принять различные стратегии в зависимости от вашей конкретной базы данных и версии – josephj1989

+0

Да, Ismail, это флажки. И josephj, я надеюсь на общее замечание по этой проблеме, а не на специфику реализации. Обычно я использую MySQL. – AmbroseChapel

ответ

2

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

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

+0

Aha! Этот «первый DELETE, затем INSERT» казался мне самым элегантным способом по сложности. Кто-нибудь хочет прокомментировать? ответ onedaywhen не имеет ни вверх, ни вниз голосов ... – AmbroseChapel

0

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

  MA  PhD  
Alice  x 
Bob     x 

где х представляет проверенные коробки. Я бы пошел с использованием интерфейсного скрипта для отправки только изменений назад на сервер.Затем делать добавления и удаления в Народе-на-градусы в рамках одной сделки, или MERGE (как было указан в ссылке Исмаила)

BEGIN TRAN 
INSERT query 
DELETE query 
COMMIT 

Вы бы скоротать INSERT (и DELETE) запросить список людей ID, пары идентификаторов типа. Для вашего примера запрос INSERT будет единственной парой (2,2), а для запроса DELETE - одиночной парой (2,1).

+0

Как скрипт переднего плана отправляет только изменения? Вы говорите, что для каждого флажка будет соответствующий с исходным значением? – AmbroseChapel

+0

Это один из способов сделать это. Другие способы: 1. Добавьте дополнительный атрибут к флажку со старым значением, которое вы можете позже получить с помощью .getAttribute 2. Добавьте событие onclick к каждому флажку, который отслеживает изменения. 3. Постройте строку/массив значений сетки при загрузке страницы и onsubmit сравнить представленные значения с этим (строка построена на onload). – potatopeelings

+0

Я старая школа. Я не думал о том, чтобы полагаться на язык сценариев на стороне клиента! – AmbroseChapel

Смежные вопросы