Kur*_*ler 3 .net sql sql-server
我有一个应用程序,用户执行操作并获得积分.在应用程序中执行算法并使用结果值更新点数据库字段或让数据库进行数学计算会更好吗?
假设0分的用户将额外收到2个:
//app does the math (0+2) and issues this statement
update users set points = 2 where id = 1
Run Code Online (Sandbox Code Playgroud)
VS
//app only knows to update by 2, db does the math
update users set points = points+2 where id = 1
Run Code Online (Sandbox Code Playgroud)
SQL性能方面有什么不同吗?对于应用程序设计,这种逻辑应该驻留在哪一种方法中,一种方法比另一方法更好吗?
编辑:这个编辑可能来得太晚,无法提供很好的服务,但我只是想回应一些反馈并做出澄清.虽然我对任何db性能差异感到好奇,但这不是一个问题.我关心的是这种逻辑最好的存在,以及为什么人们应该优先于另一种情况以及在哪种情况下.
一方面,我的几乎所有逻辑都存在于应用程序中,因此在那里进行数学计算是一致的,就像Hank的答案一样.但另一方面,有一些潜在的延迟/线程问题可能表明逻辑应由db执行,由Blixt和Andrew提出.
这两个操作有所不同.第一个说:
用户应该有两点; 不多也不少.
第二个说:
除了他/她已经拥有的内容之外,用户还应该获得两个积分.
我不会将这种数据逻辑放在业务逻辑层中.业务逻辑应该是"用户获得两点",它应该告诉数据库.不应该自己动手并说"数据库告诉我用户有两点,所以现在他们有四个!" 如果业务层和数据库之间存在延迟,或者在多个线程中同时进行很多更新,则这很危险.
我意识到我实际上没有在明文中提出我更喜欢的选择:
在业务逻辑中确定用户应该获得多少点.然后发出一个语句,告诉数据库按这些点增加用户的分数.通过这样做,您使数据库负责保持数据的一致性,这是一项应该只属于数据库的任务.我的意思是他们做的,对吗?
UPDATE users SET points = points + ? WHERE user_id = ?;
Run Code Online (Sandbox Code Playgroud)
您的业务逻辑层将填充空白.
如果你正在做一个庞大的项目,你甚至可能会考虑将它放在一个存储过程中,因为你可能会在将来更改数据结构(例如将点分解到另一个表或其他表):
userChangePoints ?, ?
Run Code Online (Sandbox Code Playgroud)