gpt4 book ai didi

.net - 持久化到数据库时更新或增加值更好吗?

转载 作者:行者123 更新时间:2023-12-02 15:42:06 25 4
gpt4 key购买 nike

我有一个应用程序,用户可以在其中执行操作并获得积分。在应用程序中执行算术并使用结果值更新点数据库字段,或者让数据库进行数学计算,这会是一个更好的主意吗?

假设拥有 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 。但另一方面,存在一些潜在的延迟/线程问题,可能表明逻辑应该由数据库执行,如 Blixt 所提出的。和 Andrew .

最佳答案

这两种操作是有区别的。第一个说:

The user should have two points; no more, no less.

第二个说:

The user should get two more points, in addition to what he/she already has.

我不会将这种数据逻辑放在业务逻辑层中。业务逻辑应该是“用户获得两点”并且它应该告诉数据库这一点。它不应该把事情掌握在自己手中并说“数据库告诉我用户有两点,所以现在他们有四点!”如果业务层和数据库之间存在延迟,或者多个线程中同时进行大量更新,则这是危险的。

我意识到我实际上并没有以明文形式给出我喜欢的选择:
在业务逻辑中确定用户应该获得多少积分。然后发出一条语句,告诉数据库将用户的分数增加这些分数。通过这样做,您可以让数据库负责保持数据一致,这是一项只应该属于数据库的任务。我的意思是他们就是这么做的,对吗?

UPDATE users SET points = points + ? WHERE user_id = ?;

您的业务逻辑层只需填补空白。

如果您正在做一个巨大的项目,您甚至可能需要考虑将其放入存储过程中,因为您将来可能会更改数据结构(例如将点分解到另一个表或类似的表):

userChangePoints ?, ?

关于.net - 持久化到数据库时更新或增加值更好吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1271570/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com