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

时间:2010-09-20 17:41:04

标签: data-access-layer

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

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

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

9 个答案:

答案 0 :(得分:5)

在数据库级别。

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

答案 1 :(得分:4)

作为一般规则:任何合理地属于db的职责且的任何内容都可以在您的数据库中完成,在您的数据库中执行

答案 2 :(得分:2)

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

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

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);
}

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

可能有以下帮助:

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.
}

答案 3 :(得分:1)

在数据库中。

答案 4 :(得分:1)

我一直被告知,应尽可能在数据层中处理数据。过滤数据是DB专门做的事情,并且已经过优化。因此,这就应该发生。

这也可以防止重复劳动。如果数据过滤发生在数据层中,那么其他代码/系统可以从相同的存储过程中受益,而不是复制BLL中的工作。

我发现人们喜欢将主要逻辑放在他们最熟悉的部分。无论开发人员的优势如何,数据处理都应该尽可能地进入数据层。

答案 5 :(得分:1)

我在今年早些时候的SSRS课程中问了一个类似的问题,当时我想知道“最佳实践”是让存储过程检索查询数据而不是在报表的数据集中执行TSQL。我收到的回复是:允许数据库引擎执行“繁重的工作”。也就是说,在存储过程中进行所有选择,分组和排序,并允许SSRS专注于交付结果。

您的方案也是如此。无论如何,我的投票将是在您的存储过程中进行所有过滤。从您的应用程序中调用sproc并让数据库完成工作。

答案 6 :(得分:1)

如果您有一个位于数据库顶部的大型二级缓存以及您要过滤的数据的大部分(或全部),那么它也会依赖于您的数据抽象模型。在缓存中然后是保留在应用程序内并使用缓存数据。

答案 7 :(得分:1)

当您考虑永远不会包含超过几十行的表时,差异并不是很重要。

当您考虑将增长到数千,数十万或数百万行的表时,在数据库中进行过滤将成为明显的选择。传输那么多数据以过滤记录子集是没有意义的。

答案 8 :(得分:0)

如果在数据库中进行过滤,则实际上只会在数据库和应用程序服务器之间的线路上发送应用程序所需的数据。出于这个原因,我建议最好在数据库中进行过滤。