我可以依靠检查约束来确保非负余额吗?
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 检查约束来检查非零约束。由于您的应用程序正在处理数据库,因此最好在应用程序内而不是在数据定义层处理检查约束。
它使我们能够更好地控制传递异常响应以及要传达的消息。
我目前有一个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 检查约束来检查非零约束。由于您的应用程序正在处理数据库,因此最好在应用程序内而不是在数据定义层处理检查约束。
它使我们能够更好地控制传递异常响应以及要传达的消息。