1

我正在使用 Access 2003 VBA 来处理制造 BOM 的递归数据。我构建了一个类模块,让我的主表具有静态范围。这似乎简化了递归——当我遍历 BOM 时,它让我不必再向下和向上计数级别。我不会重复地打开同一个记录集;我过滤了很多。

在开始这项工作后,我阅读了有关对象关系建模的内容,并决定实例化不是记录集,而是记录。那么该记录的字段可能是属性。经过大量的工作和许多大多是错误的胜利的快感之后,我意识到这种方法没有任何好处,因为 Access 是基于表的。

我的课程模块仍然像以前一样有帮助。我的问题是关于以下两个替代版本。第一个使用两个实例(父、子)。第二个使用一个,然后重用它。显然第一个是受 ORM 影响的。

有什么理由选择其中一个而不是另一个?另外,请注意最后的斜体线:如果我不需要(因为我不需要有关父级的更多信息),那会改变答案吗?任何人都可以帮助我总体思考吗?

(请注意,我关闭记录集而不是类实例。我的理解是 VBA 实例关闭自己并让他们这样做是公认的做法。我似乎已经将伪代码提升到新的伪水平......目标是清晰,希望有用。)

    版本 1
    属性子 ReviewPart ( Parent_Part_ID )

    获取 Parent_Part_ID
    创建类的实例 --> 获取记录集
    筛选类记录集 (Parent_Part_ID)
    利用类记录集
    查看 Parent_Part_ID 是否有 Childs
    如果是这样:
       打开 Childs 的记录集
       对于每个孩子
         获取 Child_Part_ID
         创建类的实例 --> 获取记录集
         筛选类记录集 ( Child_Part_ID )
         利用类记录集
         查看 Child_Part_ID 是否有 Childs
         如果是这样:  
           实例新 ReviewPart ( Child_Part_ID )
         除此以外:
         没有; 继续
       下一个孩子
       关闭 Childs 的记录集
    除此以外:
       继续
    Exploit Class 记录集(仍然指向父级)
 
版本 2 属性子 ReviewPart ( Parent_Part_ID ) 获取 Parent_Part_ID 创建类的实例 --> 获取记录集 筛选类记录集 (Parent_Part_ID) 利用类记录集 查看 Parent_Part_ID 是否有 Childs 如果是这样: 打开 Childs 的记录集 对于每个孩子 获取 Child_Part_ID 创建类的实例 --> 获取记录集 筛选类记录集 ( Child_Part_ID ) 利用类记录集 查看 Child_Part_ID 是否有 Childs 如果是这样: 实例新 ReviewPart ( Child_Part_ID ) 除此以外: 没有; 继续 下一个孩子 关闭 Childs 的记录集 除此以外: 继续 过滤类记录集(Parent_Part_ID) 利用类记录集(仍然指向父类)
4

2 回答 2

1

从程序员的角度来看,前者似乎为您提供了更好的易用性,因为您可以简单地从您感兴趣的记录开始,并通过访问您开始使用的记录的属性轻松地根入关联记录。

另一方面,后者似乎更有效,因为它不会悲观地加载可能与当前记录相关的每条记录。

第一种方法的一些潜在优化可能有助于它在保持易用性的同时接近第二种方法的效率:

  • 仅在需要时加载子记录。使用 Get/Set 访问器将允许您及时加载它们,而不是在从数据库中提取父记录时一次全部加载。
  • 或者,使用 JOIN 作为单个查询的一部分一次检索所有子数据。这仍然会为您提供所有预加载的数据,但会减少您必须运行的查询数量以大幅获取数据。

希望这会有所帮助。

于 2009-07-15T18:27:58.427 回答
1

您是否考虑过使用 msdatashape 提供程序和 SHAPE 语法来生成分层 ADO 记录集

于 2009-08-10T11:20:16.050 回答