Что лучше, фильтруя результаты в БД или в приложении? - PullRequest
2 голосов
/ 20 сентября 2010

Простой вопрос. Бывают случаи, когда я получаю данные и затем обрабатываю их в своем BLL. Но я понял, что такую ​​же обработку / фильтрацию можно выполнить в моей хранимой процедуре, и отфильтрованные результаты возвращаются в BLL.

Что лучше: обработка в БД или обработка в BLL? И почему?

рассмотрите сценарий, я хочу проверить, существует ли продукт в моей базе данных, и, если он существует, добавить это к заказу (пример взят из ответа Nour Sabony ниже), теперь я могу сделать эту проверку на своем BLL, или я делаю это и в хранимой процедуре. Если я объединяю вещи в одну процедуру, я сокращаю всю операцию до одного вызова БД. Это лучше?

Ответы [ 9 ]

5 голосов
/ 20 сентября 2010

На уровне базы данных.

Базы данных должны быть оптимизированы для запросов, так зачем все усилия возвращать большой набор данных, а затем выполнять фильтрацию в приложении?

4 голосов
/ 20 сентября 2010

Как правило: все, что в разумных пределах относится к обязанностям БД и может быть выполнено в вашем БД, делать это в вашем БД.

2 голосов
/ 20 сентября 2010

хорошо, самый лучший ответ в базе данных, но вы можете рассмотреть что-то вроде Linq2Sql, Я имею в виду написать выражение на уровне представления, и оно будет проанализировано как Sql Statement на уровне доступа к данным.

конечно, есть ситуации, когда 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);
}

но если вы создаете представление Browse, не рекомендуется (с точки зрения производительности) приносить все данные из 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.
}
1 голос
/ 20 сентября 2010

Разница не очень важна, если рассматривать таблицы, которые никогда не будут содержать более нескольких десятков строк.

Фильтрация в БД становится очевидным выбором, когда вы рассматриваете таблицы, которые вырастут до тысяч, сотен тысяч или миллионов строк. Было бы бессмысленно передавать столько данных для фильтрации по подмножеству записей.

1 голос
/ 20 сентября 2010

Чтобы показать разные точки зрения, это также действительно зависит от вашей модели абстракции данных, если у вас есть большой кэш 2-го уровня, который находится поверх вашей базы данных, и большую часть (или всю) ваших данных вы будете фильтровать находится в кеше, тогда да, оставайтесь внутри приложения и используйте кэшированные данные.

1 голос
/ 20 сентября 2010

Я задал подобный вопрос в классе SSRS ранее в этом году, когда я хотел узнать «наилучшую практику» для того, чтобы хранимая процедура получала запрашиваемые данные вместо выполнения TSQL в наборе данных отчета. Ответ, который я получил, был: Разрешить ядру базы данных выполнять «тяжелую работу». То есть выполните все операции выбора, группировки, сортировки в хранимой процедуре и дайте SSRS возможность сосредоточиться на получении результатов.

То же самое верно для вашего сценария. Во что бы то ни стало, я проголосовал бы за всю фильтрацию в вашей хранимой процедуре. Вызовите sproc из вашего приложения и позвольте базе данных сделать всю работу.

1 голос
/ 20 сентября 2010

Меня постоянно учили, что данные должны обрабатываться на уровне данных, когда это возможно.Фильтрация данных - это то, что БД специально для этого делает и оптимизирует для выполнения.Поэтому это то, где это должно произойти.

Это также предотвращает дублирование усилий.Если фильтрация данных происходит на уровне данных, то другие код / ​​системы могут извлечь выгоду из той же хранимой процедуры вместо дублирования работы в вашем BLL.

Я обнаружил, что людям нравится размещать основную логику в разделечто им удобнее всего работать. Независимо от сильных сторон разработчика, обработка данных должна идти на уровне данных, когда это возможно.

1 голос
/ 20 сентября 2010

в базе данных.

0 голосов
/ 20 сентября 2010

Если вы фильтруете базу данных, то только данные, которые требуются приложению, фактически передаются по проводам между базой данных и сервером приложений.По этой причине я предлагаю лучше фильтровать в базе данных.

...