首页 > 解决方案 > 在数据库中有效地存储/更新不可预测的列表

问题描述

我有一个列表,其中包含订单中的每个项目,其中包含数量。显然,每次更新订单时,列表的大小都会有所不同。我会对更新​​时最有效的方法感兴趣:合并语句,或删除该订单的所有项目,然后添加客户选择的所有项目。

我觉得合并语句是最好的,因为我不需要删除和添加未更改的项目。问题是当向数据库添加项目时,我需要传回自动生成的 ID,以便我可以在项目中跟踪它。对于一个非常慢的服务器,我不确定那是最有效的。特别是当我需要将整个项目传回时,我知道哪个 ID 与哪个对象匹配。目前,我正在通过 C# 中的数据表完成所有操作,而不是在单独的 SQL 查询中运行每个项目,因此我从合并语句中获取了已添加项目的列表及其 ID。

编辑-恐怕我还没有真正澄清我的问题。我相信我理解 Merge 声明。我正在使用 Merge 的输出将项目及其自动生成的 ID 传回。我不是在问如何进行合并。问题是为什么合并比删除订单的所有订单项然后添加用户选择的项目更有效。使用合并时我需要传递订单的所有订单项,以便合并不会无论如何都不要删除 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

标签: c#tsqldatabase-design

解决方案


合并语法允许output子句,您可以使用它来输出自动生成的 id:https ://docs.microsoft.com/en-us/sql/t-sql/statements/merge-transact-sql


推荐阅读