Обновите один-ко-многим данным отношений в базе данных - PullRequest
3 голосов
/ 29 марта 2011

Я хочу обновить список в базе данных, который имеет отношение один ко многим.

Например, есть более 100 предметов, и студент может выбрать все, что он хочет. Допустим, в следующий раз этот студент отредактирует свой выбор.

Как бы вы обновили базу данных для этого случая? То, что я привык делать, это удалить все прошлые выборы и добавить все вновь выбранные предметы. Это довольно простая логика, но мне просто интересно, есть ли лучший способ сделать это с точки зрения производительности. В моем случае «delete» - это один вызов базы данных, а вставка «все» - это цикл в одном соединении с базой данных.

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

Спасибо!

1 Ответ

4 голосов
/ 29 марта 2011

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

Другим способом сделать это может бытьпередать новый набор как параметр с табличным значением в SP на Sql Server, который затем использовал бы два запроса для внесения изменений

delete many_table
where studentid=@studentid and someid not in (select someid from @tableparam p)

insert many_table(studentid, someid)
select @studentid, p.someid
from @tableparam p left join many_table t on p.someid=t.someid and t.studentid=@studentid
where t.someid is null

(для SQL Server существует более элегантный синтаксис MERGE2008, который является еще одним вариантом, дальнейшее тестирование ваших навыков TSQL)

...