从不同系统合并/加入类似集合的可能方法

时间:2011-02-17 21:59:40

标签: c# .net

我在没有令人满意的解决方案的情况下继续遇到相同的编程任务。我有来自不同系统的类似的对象集合,我需要将它们组合或合并为一个,并可能报告两者之间的交叉点。

这方面的一个很好的例子可能是来自Active Directory的用户集合,以及来自SAP的相同用户集合(具有AD中不存在的一些更丰富的属性)。我只想要一个包含两个集合属性的用户集合。

或者我可能在SharePoint中有一组用户,以及Constant Contact中的一组新闻稿订阅者,我希望得到所有当前活跃用户的集合,这些用户也是Constant Contact中的新闻订阅者。

鉴于两个集合中都有一个共同的标识符(电子邮件地址,某种ID),我发现我很少有选择来有效地获取合并数据:

  1. 从系统A获取所有对象。从系统B获取所有对象。在双循环中,查找匹配项并将它们添加到新集合中。
  2. 从系统A获取所有对象。对于系统A中的每个对象,查询系统B以查找匹配项并添加到新集合。
  3. 选项1很臭,因为我必须从系统B获取所有数据,即使我没有匹配也可以扔掉一些数据。选项2很糟糕,因为我必须对系统B进行许多单独的查询才能获得我的匹配。

    我知道我可以设置某种定期处理这些东西的立方体,但似乎我应该能够获取两个集合,表示它们之间的共同数据,并要求一个框架为我加入它智能。还有其他方法我可能会在这里失踪吗?

    谢谢, 亚当

2 个答案:

答案 0 :(得分:1)

在数学上你要么必须以某种方式做A或B-没有绕过它。

典型的优化是尽可能接近A或B,例如将所有数据从A复制到B,然后向B的数据库询问不匹配的元素,或者那样的东西。选择从哪个系统复制可以基于技术考虑(例如,关闭或不可访问的系统,如大型机经常从复制),性能考虑因素(B可能是比A更快或更多的scalabale系统)或数据大小考虑(如果A的数据大小比B小一个数量级,将A复制到B而不是反之亦然更有意义。)

如果数据源可以生成有序的数据流,那么您可以以流方式执行比较,而不是需要来自两个系统的所有数据。例如:

A's Data     B's Data
A            A
B            C
C            D
D            F
E
F

如果您知道数据已排序,您可以简单地迭代两个列表以查找匹配项,而不是对一个数据源进行查找。

答案 1 :(得分:0)

我会考虑数据检索需要多长时间,然后考虑您打算询问“交叉点”数据的频率。如果前者的答案是几秒钟而后者也是(可能)在几秒钟内,那么我强烈考虑将检索到的数据缓存到一个简单的数据库中。

然后,您可以执行连接并保存到第三个表,甚至可以在每个请求的SELECT语句中执行JOIN。在每个请求上执行此操作应该是一些简单的索引。

不应该需要立方体。

最后,根据可用的属性,您可以使用LastModifiedDate / CreationDate或类似信息来智能了解您刷新的行/记录。