数据库完整性:触发器与键/约束

时间:2009-09-15 23:02:43

标签: sql database-design data-modeling

我和我的朋友互相争论数据库的设计 他认为,确保复杂数据库的完整性更好地使用触发器。

我认为为此目的最好使用键(主键,唯一键)和约束键 我认为触发器的使用是危险的,因为它们“在幕后”工作,并且说出执行命令后会发生什么并不容易。而且,如果触发器有bug,它可能会破坏DB的完整性。

你怎么看?

4 个答案:

答案 0 :(得分:9)

“这是AskTom关于这个主题的讨论。在这个问题上没有严格的规则(否则就没有辩论了!)......”

是的。声明总是优于程序实现。声明不太容易出错。声明更容易维护。声明性比程序性实现更自我记录。 Declarative为DBMS提供了优化的最佳场合,DBMS在大多数情况下是比程序员更好的优化器。

程序实现的唯一优势是,如果真正的声明性约束可用,它就意味着那些没有人的工作,而不仅仅是我们从SQL获得的糟糕的PK + FK。

答案 1 :(得分:6)

你实际上并没有说出为什么你的朋友认为他的想法,但是,无论如何,约束/密钥是确保数据完整性的标准,定义和正确的方法,原因有两个:

  • 每个人都了解它们,你会避免使用它们而违反最不惊讶的原则。

  • 它们已经实施,测试和运行。

滚动自己的数据完整性代码没有任何实际好处。触发器适用于其他用例,例如(例如)保留所有插入的日志。

答案 2 :(得分:2)

你没有指定什么数据库,但我会假设一个ANSI标准,关系型DBMS,如Oracle或SQL Server。

我想这取决于你的诚信意味着什么。如果您只是试图将子记录和父记录保持在一起并防止孤立,那么使用主键和外键约束的内置RI是可行的方法。

如果你的RI更复杂,例如,如果父记录中的字段1是>那么,儿童记录中的字段2必须是< 200.必须使用触发器。

我不会使用触发器来强制执行简单的RI,这个轮子已经被发明了。

答案 3 :(得分:0)

我不认为这种方式很明显,但是fwiw,我倾向于对可以在DRI约束中完成的任何事情使用DRI约束,并为那些无法完成的事情保存触发器在DRI约束中(如防止重叠日期范围)