我在没有令人满意的解决方案的情况下继续遇到相同的编程任务。我有来自不同系统的类似的对象集合,我需要将它们组合或合并为一个,并可能报告两者之间的交叉点。
这方面的一个很好的例子可能是来自Active Directory的用户集合,以及来自SAP的相同用户集合(具有AD中不存在的一些更丰富的属性)。我只想要一个包含两个集合属性的用户集合。
或者我可能在SharePoint中有一组用户,以及Constant Contact中的一组新闻稿订阅者,我希望得到所有当前活跃用户的集合,这些用户也是Constant Contact中的新闻订阅者。
鉴于两个集合中都有一个共同的标识符(电子邮件地址,某种ID),我发现我很少有选择来有效地获取合并数据:
选项1很臭,因为我必须从系统B获取所有数据,即使我没有匹配也可以扔掉一些数据。选项2很糟糕,因为我必须对系统B进行许多单独的查询才能获得我的匹配。
我知道我可以设置某种定期处理这些东西的立方体,但似乎我应该能够获取两个集合,表示它们之间的共同数据,并要求一个框架为我加入它智能。还有其他方法我可能会在这里失踪吗?
谢谢, 亚当
答案 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或类似信息来智能了解您刷新的行/记录。