我和我的朋友互相争论数据库的设计 他认为,确保复杂数据库的完整性更好地使用触发器。
我认为为此目的最好使用键(主键,唯一键)和约束键 我认为触发器的使用是危险的,因为它们“在幕后”工作,并且说出执行命令后会发生什么并不容易。而且,如果触发器有bug,它可能会破坏DB的完整性。
你怎么看?
答案 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约束中(如防止重叠日期范围)