コメントで示された、私は通常、冗長保存するために希望されないため、潜在的に正しくありませんデータ。しかし、オンザフライで合計を計算する際にパフォーマンス上の問題がある場合は、システムに計算を依頼することをお勧めします。これは、のインデックス付きビューを使用する場合のオプションです。
表のセットアップ:
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)
)
そして今、我々は、ビューを作成することができます:あなたは、挿入、更新を実行すると、のOrderItemsまたはアイテムテーブルに対して、このビューのインデックスを(削除して、今すぐ
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)
を実際にすべてのビューデータを含む)が自動的に更新されます。
これにより、コーナーケースの問題が回避されます。手動で更新を実行するようトリガーします。
私は実際にパフォーマンスの問題を実証することができない限り、あなたが計算できる*データを保存しないことをお勧めします。 *冗長なデータを保存するとすぐに、間違ったことになる可能性があります。 –