正如在评论中指出的,我通常不喜欢存储冗余,可能不正确的数据。但是,如果在运行中计算总计时存在性能问题,则下一个最佳选择是让系统为您执行计算。如果您使用索引视图,则这是一个选项。
表设置:
create table dbo.Orders (
OrderID int not null,
/* NO Total here */
constraint PK_Orders PRIMARY KEY (OrderID)
)
go
create table dbo.Items (
ItemID int not null,
Cost decimal (19,4) not null,
constraint PK_Items PRIMARY KEY (ItemID)
)
go
create table dbo.OrderItems (
OrderItemID int not null,
OrderID int not null,
ItemID int not null,
/* I'd normally prefer Order/Item/Quantity and making Order/Item the PK */
constraint PK_OrderItems PRIMARY KEY (OrderItemID),
constraint FK_OrderItems_Orders FOREIGN KEY (OrderID) references Orders (OrderID),
constraint FK_OrderItems_Items FOREIGN KEY (ItemID) references Items (ItemID)
)
现在我们可以创建视图:
create view dbo.OrderTotals
with schemabinding
as
select
OrderID,
COUNT_BIG(*) as LineCount, /* Required for indexed view with aggregate */
SUM(Cost) as OrderTotal
from
dbo.Items i
inner join
dbo.OrderItems o
on
i.ItemID = o.ItemID
group by
OrderID
go
create unique clustered index IX_OrderTotals on OrderTotals (OrderID)
现在,当你执行插入,更新和删除针对的OrderItems或项目表,这种观点的指数(其中实际包含所有视图数据)会自动为您更新。
这样可以避免您在使用时可能会漏掉的拐角案件的任何担忧。触发器手动执行更新。
我建议不要*存储*数据,你可以*计算*,除非和直到你可以证明一个实际的性能问题,只是在飞行中计算结果。只要你*存储*冗余数据,你打开自己的机会,它*错*。 –