我有一个应用程序,用户在其中执行操作并获得积分。在应用程序中执行算术并使用结果值更新点数据库字段是否更好,或者让数据库进行数学计算?
假设获得 0 分的用户将额外获得 2 分:
//app does the math (0+2) and issues this statement
update users set points = 2 where id = 1
对比
//app only knows to update by 2, db does the math
update users set points = points+2 where id = 1
SQL 性能方面有什么不同吗?就应用程序设计、此逻辑应位于何处等而言,一种方法是否比另一种方法更好?
编辑: 此编辑可能为时已晚,无法提供很多好处,但我只是想回应一些反馈并进行澄清。虽然我对任何数据库性能差异感到好奇,但这不是问题。我关心的是这种逻辑最适合在哪里,为什么一个应该比另一个更受青睐,以及在哪些情况下。
一方面,我几乎所有的逻辑都驻留在应用程序中,因此在那里进行数学运算是一致的, like Hank's answer 。但另一方面,有一些潜在的延迟/线程问题可能表明逻辑应该由 db 执行,如 Blixt 和 Andrew 所提出的。
最佳答案
这两种操作是有区别的。第一个说:
第二个说:
我不会将这种数据逻辑放在业务逻辑层。业务逻辑应该是“用户得到两点”,它应该告诉数据库这一点。它不应该把事情掌握在自己手中并说“好吧,数据库告诉我用户有两个点,所以现在他们有四个!”如果业务层和数据库之间存在延迟,或者在多个线程中同时进行很多更新,这将是危险的。
我意识到我实际上并没有在明文中列出我更喜欢的选择:
在业务逻辑中确定用户应该获得多少积分。然后发出一条语句,告诉数据库将用户的分数增加这些点数。通过这样做,您让数据库负责保持数据的一致性,这是一项只应属于数据库的任务。我的意思是这就是他们所做的,对吧?
UPDATE users SET points = points + ? WHERE user_id = ?;
您的业务逻辑层将简单地填补空白。
如果你正在做一个巨大的项目,你甚至可能想考虑把它放在一个存储过程中,因为你将来可能会更改数据结构(例如将点拆分到另一个表或类似的):
userChangePoints ?, ?
关于.net - 持久化到数据库时更新或增加值更好吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1271570/