我可以依靠检查约束来确保非负余额吗?

Can I depend on check constraint to ensure non-negative balance?

我目前有一个table如下:

CREATE TABLE Account (
 ID int NOT NULL,
 Balance int,
 CHECK (Balance>=0)
);

我还有一些应用伪代码如下:

function updateBalance(id Int, howMuch Int) {
 check howMuch is non zero (can be negative or positive)
 read balance for id as bal
 if bal + howMuch >= 0 update else throw error
}

我觉得读取余额和检查 >= 0 是不必要的并且耗时,因为我计划使用的数据库支持检查约束(很可能是 PostgreSQL 或 H2)。某些(例如 MySQL)不支持检查约束,并且会在 create 语句中默默地忽略它们。

我应该依靠数据库来确保非负余额还是在我的应用程序中也这样做?

在数据库中使用 CHECK constraint。它在 PostgreSQL 中绝对可靠。

您可能仍想在写入数据库之前检查应用程序中的输入,以避免一开始就引发异常。但是您永远不需要仔细检查从数据库中检索到的数据。这就是像 Postgres 这样的 RDBMS 的用途。

在考虑MVC架构时,我们一般会将业务逻辑构建在Controller组件中。我们也可以盲目地依赖 PostgreSQL 检查约束来检查非零约束。由于您的应用程序正在处理数据库,因此最好在应用程序内而不是在数据定义层处理检查约束。

它使我们能够更好地控制传递异常响应以及要传达的消息。