我目前有一张表格如下:
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语句中默默忽略它们。
我应该依赖数据库来确保非负余额,还是在我的应用程序中执行此操作?
答案 0 :(得分:3)
在数据库中使用CHECK
constraint。它在PostgreSQL中绝对可靠。
在写入数据库之前,您可能仍希望检查应用程序中的输入,以避免在开始时引发异常。但您永远不需要仔细检查从数据库中检索的数据。这就像Postgres之类的RDBMS一样。
答案 1 :(得分:1)
在考虑MVC架构时,我们通常在Controller组件中构建业务逻辑。我们可以盲目地依赖PostgreSQL检查约束以及检查非零约束。由于您的应用程序正在处理数据库,因此最好在应用程序中而不是在数据定义层处理检查约束。
它使我们能够更好地控制异常的响应和传达的信息。