1

我和我的朋友就数据库的设计争论不休。
他认为,为了确保复杂数据库的完整性,最好使用触发器。

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

你怎么看待这件事?

4

4 回答 4

9

"Here is an AskTom discussion on the topic. There is no hard and fast rule on the issue (else there would be no debate!)..."

Yes there is. Declarative is always better than procedurally implemented. Declarative is less prone to making errors. Declarative is easier to maintain. Declarative is more self-documenting than procedurally implemented. Declarative offers the best occasion for the DBMS to optimize, and the DBMS IS a better optimizer than the programmer, most of the time.

The only advantage in procedurally implemented is that it means jobs for those who would be without one if true declarative constraints were available, not just the poor PK+FK that we get from SQL.

于 2009-09-15T23:45:28.147 回答
6

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

  • 每个人都知道它们,使用它们可以避免违反最小意外原则。

  • 它们已经实施、测试和工作。

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

于 2009-09-15T23:11:41.570 回答
2

您没有指定什么数据库,但我假设是 ANSI 标准的关系 DBMS,例如 Oracle 或 SQL Server。

我想这取决于你所说的完整性。如果您只是试图将子记录和父记录保存在一起并防止孤儿,那么使用主键和外键约束的内置 RI 是可行的方法。

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

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

于 2009-09-15T23:15:42.467 回答
0

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

于 2009-09-15T23:22:40.720 回答