是否应在应用程序或数据库级别进行验证?

时间:2015-08-07 17:57:27

标签: sql relational-database constraints

我对数据库编程比较陌生,我发现SQL的编码方面非常直观。通过编码,我的意思是,例如,在列中查找单个字符串值并将其大写,将其与另一个值连接,根据引用它的另一个表修改它,等等。

我的问题是,在数据库级别或应用程序级别执行管理数据的规则是否更好,以及原因。例如,This article(请参阅通过应用程序强制执行完整性),认为应该在数据库级别强制执行。

以下是两个例子,一个是显而易见的,另一个是复杂的。

如果我们有一个简单的Person表,那么

CREATE TABLE Person(
    id SERIAL,
    age INT CHECK (age>=0)
);

在数据库级别强制执行非负年龄是有意义的。但是,如果我们有一个更复杂的例子,那么

CREATE TABLE Person(
    id SERIAL,
    age INT CHECK (age>=0),
    spouse INT REFERENCES Person (id)

);

确保

  1. 配偶双方都超过18岁
  2. 配偶双方在结婚时都是单身
  3. 配偶不是一夫多妻的关系
  4. 需要更复杂的触发器。或者,当使用更多人类可读的语言(如PHP或Python)添加到数据库时,可以检查这些内容。如果只为一个程序构建数据库,那么在数据库级别强制执行这些规则是否可以接受?

1 个答案:

答案 0 :(得分:1)

在设计数据库和应用程序时,这是一个至关重要的设计问题。有些事情要考虑:

  1. 您是否打算为用户提供字段级验证反馈?如果是这样,那么您可以在应用程序代码中更好地完成字段级验证。否则,当您尝试插入时,您必须解码异常以找出问题所在。
  2. 您对数据库及其功能有多熟悉?您放入数据库的逻辑越多,您对其语法和行为的依赖就越大。
  3. 应用程序是否会被移植到另一个数据库?例如,从SQL-Server到MySQL?或Postgres到Oracle?如果是这样,那么请考虑将嵌入在模式中的逻辑转换为新数据库的词典所需的工作量。
  4. 我倾向于将验证应用程序和完整性约束(a.k.a外键约束)放入数据库中。我将验证放入应用程序中,以便告诉用户他们的输入有什么问题。我认为完整性约束在数据库级别至关重要,因为您不可避免地需要进行某种手动数据库更新来纠正问题,添加新功能等等。这些约束可以保护您免受这些手动更新中的错误以及应用程序逻辑中的错误的影响。