Upsert是否违反单一责任原则?

Jon*_*ell 5 sql sql-server oop design-patterns stored-procedures

我喜欢使用Upsert存储过程来更新记录(如果它们存在)或者如果它们不存在则插入它们.没有它们,我需要首先找出记录是否存在,然后根据结果调用两个单独的存储过程.

在我创建名为UpdateOrDeleteRow的存储过程之前,我从未真正考虑过这个问题.当我发现自己在名字中包含"Or"时,我的SRP蜘蛛感开始了,我意识到这些upotss基本上是相同的.

这是违反SRP的吗?如果是这样,是否可以接受?如果没有,我该怎么办?

我意识到SRP是一个OOP原则,而T-SQL不是OOP语言,但原理的基础似乎也应该适用于此.

Ser*_*kiy 5

还有一个原则,比 SRP - DRY更令我喜欢。因此,如果您在一个地方调用此序列,您可以考虑单一职责。但是,当您多次重复相同的操作序列时,DRY 会让我删除重复项。

顺便说一句,我想到的是,您可以OR在过程/方法名称中避免这种情况。UpdateOrInsert操作有很好的名字Save。我认为这不会破坏建议零售价。


Aar*_*and 3

我个人并不认为这个原则完全适用于 SQL Server。存储过程并不总是只执行一个操作(我认为存储过程相当于类的概念是有缺陷的)。我认为将存储过程中的每个语句拆分为自己的存储过程是没有意义的。你可能会对此感到非常荒谬。

当然,这是一个平衡点,因为你可能会以另一种方式变得荒谬。您不希望存储过程具有 18 种不同的方式来指定参数,以便它可以根据组合执行 540 种不同的操作。

对于 UPSERT,我仍然建议使用单个存储过程就可以了。如果您想让它服务于单一目的,请将您的更新/插入更改为单个MERGE. :-) 也就是说,严肃地说,要非常小心MERGE.