Эффективное хранение / обновление непредсказуемого списка в базе данных - PullRequest
0 голосов
/ 01 октября 2019

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

Я чувствовал, что оператор слияния был лучшим, поскольку яне нужно будет удалять и добавлять элементы, которые не изменились. Проблема в том, что при добавлении элементов в базу данных мне нужно будет возвращать автоматически сгенерированный идентификатор, чтобы я мог отслеживать его в проекте. С очень медленным сервером я не был уверен, что это самый эффективный сервер. Тем более, что мне нужно передать весь элемент обратно, чтобы я знал, какой идентификатор соответствует какому объекту. В настоящее время я делаю все через таблицу данных в C # вместо того, чтобы запускать каждый элемент в отдельном запросе SQL, поэтому я получаю список добавленных элементов из моего оператора слияния с их идентификаторами.

EDIT- Боюсь, я действительно не уточнил свой вопрос. Я верю, что понимаю заявление о слиянии. Я использую вывод из слияния, чтобы передать обратно элементы с автоматически сгенерированными идентификаторами. Я не спрашиваю, как сделать слияние. Вопрос в том, почему объединение более эффективно, чем удаление всех OrderItems для ордера, а затем добавление элементов, которые пользователь выбрал обратно. Мне нужно передать все OrderItems для ордера при использовании Merge, чтобы слияние не произошло. В любом случае не могу удалить OrderItem. Как правильно обрабатывать этот сценарий?

//Order.cs
public int OrderID {get; set;}
public List<OrderItem> {get; set;}
//OrderItem.cs
public int ItemID {get; set;} //Reference to Item.cs I'd add another ID to use merge?
public int Qty {get; set;}
//Item.cs
public int ItemID {get; set;}
public string DisplayName {get; set;}
public decimal ItemCost {get; set;}
--Orders.sql
OrderID int primary key identity
--OrderItems.sql
ID int primary key identity, 
OrderID int not null,
ItemID int not null,
Qty int not null,
constraint [FK_OrderItems_Orders] foreign key ([OrderID]) references [Orders]([OrderID]),
constraint [FK_OrderItems_Items] foreign key ([ItemID]) references [Items]([ItemID])
--Items.sql
ItemID int primary key identity,
DisplayName varchar(100) not null,
ItemCost money not null

1 Ответ

0 голосов
/ 02 октября 2019

Синтаксис объединения позволяет использовать предложение output, которое можно использовать для вывода автоматически сгенерированных идентификаторов: https://docs.microsoft.com/en-us/sql/t-sql/statements/merge-transact-sql

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...