代码之家  ›  专栏  ›  技术社区  ›  Dmitriy

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

  •  1
  • Dmitriy  · 技术社区  · 15 年前

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

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

    你觉得怎么样?

    4 回复  |  直到 15 年前
        1
  •  9
  •   Erwin Smout    15 年前

    “下面是一个关于这个主题的asktom讨论。在这个问题上没有硬性规定(否则就没有辩论!)……”

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

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

        2
  •  6
  •   Vinko Vrsalovic    15 年前

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

    • 每个人都知道它们,你可以避免使用它们来违反最小惊喜原则。

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

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

        3
  •  2
  •   HitLikeAHammer    15 年前

    您没有指定什么数据库,但我假定使用一个ANSI标准的关系DBMS,如Oracle或SQL Server。

    我想这取决于你所说的正直。如果您只想将子记录和父记录放在一起并防止孤立记录,那么使用主键和外键约束的内置RI是可行的。

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

    我不会用触发器来执行简单的ri,因为这个轮子已经被发明出来了。

        4
  •  0
  •   Charles Bretana    15 年前

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