2009-09-15 41 views
1

我和我的朋友们互相争论数据库的设计。
他认为,要确保复杂数据库的完整性,最好使用触发器。数据库完整性:触发器与键/限制

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

您对此有何看法?

+3

如果你问我,比较苹果和橙子... – ChristopheD 2009-09-15 23:04:56

回答

9

“这是在话题的AskTom讨论,没有硬的问题快治(否则就不会有争论!)......”

是的。声明式总是比程序式执行更好。声明不太容易犯错误。声明性更容易维护。声明式是比程序化实现更多的自我记录。声明式为DBMS提供了最佳的优化场景,大多数情况下,DBMS比程序员更优化。

在程序上实现的唯一的好处是,它意味着对于那些谁是没有一个真正的,如果声明的约束可用,而不仅仅是可怜的PK + FK,我们从SQL找到工作。

+1

+1:我还会补充说,使用触发器逻辑在多用户环境中编写参照完整性非常困难(因为触发器没有看到其他会话的未公开数据)。 – 2009-09-16 09:33:11

6

你居然不说为什么你的朋友认为他的想法,但是,在任何情况下限制/键是标准,规定和适当的方式,以确保数据的完整性,有两个原因:

  • 每个人都知道他们,你会通过使用他们避免违反最小惊喜的原则。

  • 他们已经实施,测试和工作。

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

2

你并没有说明具体的数据库,但我会承担的ANSI标准,关系数据库管理系统,如Oracle或SQL Server。

我猜这取决于你的完整性。如果您只是试图将孩子记录和父母记录集中在一起,并防止孤儿,那么使用主键和外键约束的内置RI是要走的路。

如果您的RI更复杂,例如,如果父记录中的字段1大于100,则子记录中的字段2必须是< 200.必须使用触发器。

我不会使用触发器来执行简单的RI,该轮已经被发明。

0

我不认为这是明确的方式或其他方式,但fwiw,我倾向于使用DRI约束来处理任何可以在DRI约束条件下完成的任务,并为那些不可能的事情保存触发器在DRI约束进行(如防止重叠dateranges)