在一个独立的应用程序'。,业务逻辑必须驻留在哪里?

时间:2010-11-08 13:49:47

标签: sql-server database oracle

我读过Tom Kyte的“设计有效的Oracle”。在那里他说要在DB本身编写大部分代码来减少应用程序代码。它在分布式环境中很好,但它在独立应用程序中也有优势吗?

我的应用。在.NET中。

2 个答案:

答案 0 :(得分:6)

是的,即使对于独立的应用程序,将业务逻辑放在Oracle数据库中也有很多优点:

  • 业务逻辑涉及访问或更新数据库的性能和可伸缩性
  • 依赖关系跟踪:很容易找到对代码中的表和其他对象的引用
  • PL / SQL 设计用于编写访问数据库的代码,非常简单,无需构建大量动态SQL预处理语句,或使用像Hibernate这样的混淆层来执行此操作你。

我实际上会偷走Josh的一些答案并将其转动180度:

  

如果你的数据库只会这样   支持单个应用程序和IF   你永远不会期望相同的数据   不同的用例取决于谁   使用它...然后肯定把业务   ......中的逻辑。

<强>应用

我的意思是,您是否真的希望两个不同的应用程序访问相同的数据行,但应用不同的规则来更改该数据?如果只是通过使用不同的访问路径来破解它,那么拥有“规则”有什么意义呢?

请注意,我省略了Josh答案的这一部分:

  

...如果你从来没有计划过   使用不同的存储机制......

当然,如果你打算支持多个数据库,或者扔掉Oracle并开始使用SQL Server或其他东西完全存储你的数据,那么你就不会想要使用PL了/ SQL编写代码。但是在许多情况下,很多情况都不会发生,而且为了自己的利益而不建议追求数据库独立性。

答案 1 :(得分:2)

IF 您的数据库只支持单个应用程序, IF 您永远不会期望相同的数据根据谁使用它来使用不同的用例, IF 你永远不会计划使用不同的存储机制......然后确保将业务逻辑放在数据库中。

然而,如果其中任何一个是真的(我怀疑)。然后我,也许这个网站上的大多数人会强烈建议你不要走这条路。

将逻辑放入数据库可能很诱人,因为您认为“我可以动态更改它!”但这是一条你不想走的维修之路。聆听经验之声,并将您的疑虑分开。

  

我的应用。是一个独立的Windows应用程序。   这是库存和发票   解。目前,我写了课   包含执行各种方法   数据库操作,如插入,更新和   删除。我想知道,如果我能写的话   存储过程在DB本身和   只通过.NET传递参数   前端,它有什么优势   给?

这对我来说实际上听起来并不像商业逻辑,除非你当然要做的不仅仅是CRUD操作。在这种情况下,那么您是否在代码中使用存储过程,ORM或手动生成的查询是一个实现细节。

数据访问层应该关心连接到数据存储机制,但应用程序的其余部分应该不关心。我将举例说明:

public class MyDomainObject
{
    public String Name {get; set;}

    public Boolean IsValid()
    {
        return !String.IsNullOrWhitespace(Name) &&
           DoesNotContainInvalidCharacters(Name);
    }
}

public class MyDataAccess
{
    public List<MyDomainObject> GetAll()
    {
        //Some data access logic here
    }

    public MyDomainObject GetByName(String name)
    {
        //Some data access logic here
    }

    public void Save(MyDomainObject)
    {
        if(MyDomainObject.IsValid)
        {
            //Some data access logic here
        }
    }
}

现在您有一个域对象和一个数据访问对象。域对象强制执行一些可以通过IsValid属性检查的简单业务逻辑,数据访问层使用它来确定是否应该保存它。但是,数据存储方式的详细信息对域/业务层并不重要。

如果你想重构使用存储过程,那么你的应用程序应该不在乎。