观察者与触发器

时间:2008-11-21 00:57:38

标签: database design-patterns

普遍的共识是什么?

如果您需要在给定操作后更改数据库,是否使用观察者模式并让框架/应用程序为您处理更新?或者您是否绕过应用程序并将更新委托给数据库触发器?

显然触发器更快,但它值得吗?

3 个答案:

答案 0 :(得分:3)

当我们使用LINQ2SQL时,这个任务很容易被覆盖,覆盖SubmitChanges()方法。我们的主要目标是在表格中进行审核。代码是这样的:

    /// <summary>
    /// Sends changes that were made to retrieved objects to the underlying database, 
    /// and specifies the action to be taken if the submission fails.
    /// NOTE: Handling this event to easily perform Audit tasks whenever a table gets updated.
    /// </summary>
    /// <param name="failureMode">The action to be taken if the submission fails. 
    /// Valid arguments are as follows:<see cref="F:System.Data.Linq.ConflictMode.FailOnFirstConflict"/>
    /// <see cref="F:System.Data.Linq.ConflictMode.ContinueOnConflict"/></param>
    public override void SubmitChanges(System.Data.Linq.ConflictMode failureMode)
    {
        //Updates
        for (int changeCounter = 0; changeCounter < this.GetChangeSet().Updates.Count; changeCounter++)
        {
            object modifiedEntity = this.GetChangeSet().Updates[changeCounter];
            SetAuditStamp(this, modifiedEntity, ChangeType.Update);
        }

        //Inserts
        for (int changeCounter = 0; changeCounter < this.GetChangeSet().Inserts.Count; changeCounter++)
        {
            object modifiedEntity = this.GetChangeSet().Inserts[changeCounter];
            SetAuditStamp(this, modifiedEntity, ChangeType.Insert);
        }
        base.SubmitChanges(failureMode);

我们特别喜欢使用触发器,因为它们始终隐藏在您的数据库中,并且很难解决可能发生的问题...将这些问题放入您的代码中您只需要开始调试它以找出原因事情已经失败了......

答案 1 :(得分:3)

我使用触发器,但触发器通常是特定于数据库的。如果您计划支持多个数据库服务器,当然可以找到在代码中覆盖它的方法。如果您确定自己将使用特定的数据库服务器,那么您的数据完整性将会让您感兴趣。

答案 2 :(得分:2)

除非您支持多个DBMS,否则您的框架在未来5年内(比如说)比您选择的DBMS更有可能发生变化。此外,将来可能需要支持其他形式的输入,例如,网页或移动设备。将这些操作放入数据库触发器意味着无论触发它们的应用程序如何都将执行操作。