4

我想知道填充业务对象层次结构(父/子/孙子)结构的最佳实践来自单个数据库调用。

我可以想到几种方法来完成它,例如:

左连接我的 sql 语句中的所有关系,然后使用循环和逻辑来填充业务对象

或者

使用几个 select 语句和 1 个 datareader 并使用其 NextResult() 方法遍历每个结果集并填充相应的 BO

只是想知道最好的做法是什么

我正在为我的 DAL 使用 DAAB 和 c#

谢谢!

4

5 回答 5

4

没有通用的食谱。它取决于数据库架构、数据库大小和您的应用程序在典型场景中读取的记录数。您在这里有两个过程:

  • 从数据库中获取数据
  • 填充业务对象

从数据库中获取数据比在内存中创建对象要慢几个数量级。最好的方法是构造选择语句以实现最快的数据访问。

查询可以通过三种方式构建:

  • 一个在单次执行中获取所有内容的大型查询 - 您将获得最复杂的 SQL,并且可能是最快的执行(取决于 DB 模式)
  • 主/详细方法 - 简单查询。大量的数据库流量。仅当您获取少量记录时才可以接受,否则会非常慢。
  • 混合:对层次结构的每一层进行一次查询。如果前两种方法要慢,请考虑这种方法。这种方法需要更复杂的逻辑来填充业务对象。

您应该决定哪种解决方案是可以接受的。需要考虑的一些关键点:

  • 哪个 SQL 更容易创建和维护 - 一个大的可以一次读取所有内容,或者几个较小的。
  • 当您选择上一点时,您应该衡量性能并做出最终决定
于 2009-01-14T01:55:20.227 回答
1

我曾经使用多个返回的数据集,但开销和不断变化的 API 最终让我回到只使用连接来一次性返回所有数据集。

我密切关注结果集的大小,但在我遇到的任何应用程序的上下文中,这都不是问题。总的来说,我并不后悔这样做,但 YMMV。

如果父级选择子句涉及子级选择规则,则多个结果集会变得特别松散。

这种方式处理所有情况;有时将其拆分是可行的,但在某些情况下您最终会需要单组查询;并且只有一种模式很好——尤其是如果你有时被从一种模式重构到另一种模式所困。

最后,您最终会减少对数据库的访问,并且事务管理更简单。

于 2009-01-14T01:39:33.253 回答
0

DataReader NextResult 是最好的,因为通过管道的数据量不会像连接方法那样快速增长。

于 2009-01-14T01:11:39.487 回答
0

您是否考虑过使用诸如 NHibernate 之类的 OR 映射器?急切加载可以在一次调用数据库时完成您所要求的事情。

如果 OR Mapper 不是一个选择,那么我将投票支持 datareader.NextResultSet。

于 2009-01-14T02:14:17.647 回答
0

如果所有行都来自同一个表(或看起来是),那么您可以将数据拉入具有一元关系的数据集,ADO.NET 将为您链接层次结构

于 2009-01-14T02:25:12.023 回答