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

问题描述 投票:0回答:2

我目前有一个表格如下:

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)不支持检查约束,并且会在创建语句中默默地忽略它们)。

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

sql postgresql h2 check-constraints
2个回答
4
投票

在数据库中使用

CHECK
约束。在 PostgreSQL 中绝对可靠。

您可能仍然希望在写入数据库之前检查应用程序中的输入,以避免首先引发异常。但是,当

CHECK
约束到位时,您永远不需要仔细检查从数据库检索的数据 - 和
VALID
。这就是像 Postgres 这样的 RDBMS 的用途。


2
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.