数据库约束是否应映射到业务逻辑

时间:2012-03-03 22:34:57

标签: database validation business-logic unique-constraint

数据库在用户NAME字段上有唯一的约束索引。

业务服务通过

进行检查
service.GetUser(userName);

查看用户名是否已存在。由于服务中的这种逻辑,永远不会插入重复的名称。我没有捕获具有Number = 2627的SqlException的异常,这是针对唯一约束违规的。

那么我为什么要在NAME字段上加上一个唯一约束呢?

3 个答案:

答案 0 :(得分:2)

您应该尽可能多地将业务逻辑放在数据层。关系,唯一性,长度,最小长度,价值限制,无论你能做什么。

不要相信应用程序将其正确放入,数据用户会尝试以任何方式破解它。我个人认为发送500个不良数据比接受它并稍后修复更好,尽管有些人会告诉你,因为这是一个非常有争议的问题。

祝你好运。

答案 1 :(得分:1)

将UNIQUE约束放在数据库层可确保无论插入(或更新)的条目位于何处,都不会出现重复的名称。例如,如果将其保留到应用程序层以确保唯一名称,如果有人直接从命令行插入行,或者在应用程序范围之外插入批处理脚本会发生什么?

IMO,最好将这种独特的约束行为保留在数据库层。

答案 2 :(得分:1)

  

由于服务中的这种逻辑,永远不会插入重复的名称,所以为什么我应该在NAME字段上添加一个唯一的约束?

因为没有其他好方法可以保证在数据库的整个生命周期内,除了通过该服务之外,任何应用程序都不会添加数据。

我熟悉的每个dbms都包含一个命令行界面,一个图形界面和一个批量加载器。这使至少三个应用程序可用于修改数据而无需通过service.GetUser()。