Java 在两个非常大的数据库表中查找公共项

Java 在两个非常大的数据库表中查找公共项,java,database,algorithm,join,Java,Database,Algorithm,Join,我有两个非常大的表,其中包含数百万个条目,它们包含类似的记录。因此,TableA可能与TableB具有不同的列结构来存储相同的数据,但TableA和TableB都包含一个列,用于记录的唯一指纹。找出表A和表B中包含相同指纹的常见条目的最佳方法是什么?类似的问题在这里已经被问了好几次,但这里有一个变化 比如,我将公共条目的pk存储在a表c(pk\u a,pk\u b,fingerprint)中,它表示表a和表b中的公共元组。现在,每当记录添加到TableA或TableB或从中删除时,都需要更新Ta

我有两个非常大的表,其中包含数百万个条目,它们包含类似的记录。因此,TableA可能与TableB具有不同的列结构来存储相同的数据,但TableA和TableB都包含一个列,用于记录的唯一指纹。找出表A和表B中包含相同指纹的常见条目的最佳方法是什么?类似的问题在这里已经被问了好几次,但这里有一个变化

比如,我将公共条目的pk存储在a
表c(pk\u a,pk\u b,fingerprint)
中,它表示表a和表b中的公共元组。现在,每当记录添加到TableA或TableB或从中删除时,都需要更新TableC

我对第一部分的解决方案是将指纹上的表A和表B连接起来,并将其添加到表C中

对于第二部分,查询TableC以查找类似的指纹,如果找到任何匹配项,则更新TableC。如果找不到匹配项,则扫描表格B(假设记录已添加到表格B)以查找指纹,然后更新表格C

但这是相当直观和天真的。我觉得可以用更好的方式来做


任何人有什么想法吗?

首先,我将告诉你我是如何看待这个问题的:

  • 指纹是根据表中的一个键(可能是PK,也可能是候选PK)计算的。如果不是,则没有意义(*1)。所以指纹是不变的
  • 此外,每个表的每个指纹都是唯一的(如果不是的话,那就麻烦了)
  • 理想情况下,我会将指纹作为一个新属性(非NULL UNIQUE)添加到每个表中,该属性在创建行时由触发器设置。如果表不太大且函数不太占用CPU,则可以将其更改为计算要在选择中使用的指纹的DB函数
  • 如果无法修改原始表,则需要辅助表。您可以只使用建议的表,也可以为每个原始表(指纹a、pkA/指纹B、pkB)使用一个表。您的解决方案可能更快,我的解决方案更简单(仅插入/删除,无更新),并且更具可扩展性(以防明天出现表C)。此表的记录只能通过原始表中的插入或删除操作(理想情况下通过触发器)进行修改
  • 与每一个工程一样,问题的更细微之处(您对解决方案的期望和能力)将平衡点指向了另一个解决方案中的一个

(*1)如果您可以通过更改不属于PK的属性来更改记录,则您的模型是错误的。

最终用途是什么?我的意思是,相关性需要实时准备好吗?或者您可以避免插入时的所有开销,在午夜运行批处理过程?最终用途可能会有所不同。这是一个面试问题。虽然,运行批处理可能是一个非常实用的解决方案,但也许人们已经在使用其他一些聪明的机制来实现它了。好吧,即使在采访中,我也会回访,希望得到一组更简洁的问题集(更广泛的问题-->成本效益更低的实现)。另一个有趣的问题是,是否有一些列是相同的,即使它们不是PK,它们在进行连接时也会派上用场。无论如何,我正在写另一个答案。指纹不是一个计算值,它是由数据提供的。说一首歌。歌曲的名称可能不同(由于某些拼写错误),但歌曲的指纹相同且唯一。因此,即使歌曲的名称或其他属性在表a和表B中不同,指纹仍然相同。此外,每个表可能包含具有相似指纹的记录,但现在就说它们没有?需求定义越好,解决方案就越好。。。所以,不用做太多的事情,可以将每个记录与其指纹链接到同一个表或相关表中。