为执行插入的1:N关系编写存储过程的最佳方法是什么?

时间:2009-11-16 08:46:07

标签: sql sql-server database database-design

如果我有两张桌子A和B:

A(AId,a1,a2) B(BId,AId,b1,b2,b3)

首先想到的是,我想写一个sp(存储过程)包含两个插入语句。

但是,在一秒钟之后,我觉得如果我有一个分离的sp为表B执行插入而另一个为表A执行插入,同时从A中调用B的插入sp,则会觉得更好。

请问哪种方法最好?

4 个答案:

答案 0 :(得分:1)

这取决于:如果您假设您可以在另一个环境中(即在SP的A之外)重新使用SP for B,请创建一个单独的SP。否则,只有一个SP(特别是,如果它只是一个带有两个INSERT语句的简单SP)可能会降低数据库层的复杂性。

答案 1 :(得分:1)

做两个单独的程序。即使您现在看不到需要将它们分开,通常指向未来,您希望仅对其中一个进行单独插入。然后你会很高兴分裂SP。 (关注点分离)

答案 2 :(得分:0)

我想说从维护的角度来看,最好有两个程序,因为它使设计更清晰,两个简短的程序比一个大程序更容易理解和设计。我不知道这种方法是否会产生任何性能影响。

答案 3 :(得分:0)

您还可以在两个表上创建视图,并在视图上使用INSTEAD OF INSERT触发器。这样你就把所有东西当作一张桌子。

CREATE VIEW dbo.vAB
AS
SELECT x.AId, a1, a2, BId, b1, b2 ,b3
FROM dbo.A AS x JOIN dbo.B AS y on x.AID = y.AID
go

CREATE TRIGGER dbo.myInsrt
ON dbo.vAB
INSTEAD OF INSERT
AS
BEGIN
 -- your code here to deal with both tables
END