哪个更好,在db或应用程序中过滤结果?

sha*_*shi 2 data-access-layer

一个简单的问题.有些情况下,我获取数据,然后在我的BLL中处理它.但我意识到可以在我的存储过程中完成相同的处理/过滤,并将过滤后的结果返回给BLL.

哪个更好,在DB处理或在BLL中处理?为什么?

考虑一下这个场景,我想检查一下产品是否存在于我的数据库中,如果它存在,请将其添加到订单中(以下是Nour Sabony的回答示例)现在我可以在我的BLL上进行检查,或者我在存储过程也是如此.如果我将事物组合到一个过程中,我将整个操作减少到一个db调用.那个更好吗?

Den*_*ink 6

作为一般规则:任何合理地属于数据库职责并且可以在您的数据库中完成的事情,都在您的数据库中完成

  • -1 这是一个糟糕的建议,因为任何事情都可以在数据库中完成。然而,数据库中的一切都正常完成吗? (5认同)
  • 编辑后改为+1。我认为我们很多人都见过 2000 行长的 PL-SQL 存储过程,但当有人说在数据库中执行所有操作时却看不到这一点。 (2认同)

Lit*_*les 5

在数据库级别.

应该优化数据库以进行查询,那么为什么要经过所有努力返回大型数据集,然后在应用程序中进行过滤?


Nou*_*uny 4

好吧,最好的答案是在数据库,但你可能会考虑像Linq2Sql这样的东西,我的意思是在表示层编写一个表达式,它会在数据访问层被解析为Sql语句。

当然也有一些情况BLL应该从DAL获取一些数据,处理它,然后将其返回给DAL。举个例子:PutOrder(Order value) 过程,它应该检查订购产品的可用性。

public void PutOrder(Order _order)
{
foreach (OrderDetail _orderDetail in _order.Details)
   {
    int count = dalOrder.GetProductCount(_orderDetail.Product.ProductID);
    if (count == 0)
    throw new Exception (string.Format("Product {0} is not available",_orderDetail.Product.Name));
    }
    dalOrder.PutOrder(_order);
}
Run Code Online (Sandbox Code Playgroud)

但如果您要创建浏览视图,从 Dal 获取所有数据然后选择在浏览视图中显示的内容并不是一个好主意(从性能角度来看)。

以下可能会有所帮助:

public List<Product> SearchProduts(Criteria _criteria)
{
string sql = Parser.Parse(_criteria);
///code to pass the sql statement to Database procedure and get the corresponding data.
}
Run Code Online (Sandbox Code Playgroud)