【问题标题】:DB integrity: trigger vs. keys/constraints数据库完整性:触发器与键/约束
【发布时间】:2009-09-16 08:57:10
【问题描述】:

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

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

你怎么看?

【问题讨论】:

  • 如果你问我比较苹果和橘子...

标签: sql database-design data-modeling


【解决方案1】:

“这是关于该主题的 AskTom 讨论。在这个问题上没有硬性规定(否则就不会有辩论!)...”

是的,有。声明式总是比程序式执行要好。声明式不太容易出错。声明式更容易维护。声明式比程序式实施更能自我记录。声明式为 DBMS 优化提供了最佳时机,而且 DBMS 在大多数情况下是比程序员更好的优化器。

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

【讨论】:

  • +1:我还要补充一点,在多用户环境中使用触发器逻辑对参照完整性进行编码非常困难(因为触发器看不到其他会话的未提交数据)。
【解决方案2】:

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

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

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

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

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-11-09
        • 1970-01-01
        • 2018-06-21
        • 1970-01-01
        • 2017-11-26
        • 2016-04-24
        • 1970-01-01
        相关资源
        最近更新 更多