2011-07-10 26 views
0

我有两个非常大的表,其中包含数百万个条目,它们包含相似的记录。因此,TableA可能具有与TableB不同的列结构来存储相同的数据,但TableA和TableB都包含用于记录的唯一指纹的列。找出TableA和TableB中包含相同指纹的常用条目的最佳方法是什么?这里也有类似的问题在这里问过几次,但这里有一些变化。假设我将常见条目的pk存储在TableC(pk_a, pk_b, fingerprint)中,表示表A和表B中的公共元组。现在,无论何时将记录添加到TableA或TableB中或从中删除,都需要更新TableC。查找两个超大型数据库表中的常见条目

我对第一部分的解决方案是将指纹上的TableA和TableB连接加入到指纹中,并将其添加到TableC中。

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

但是,这是非常直观的,并且na ï ve。我觉得可以以更好的方式完成。

任何想法的人?

+0

最终用途是什么?我的意思是,相关性需要实时准备好?或者,也许你可以避免插入的所有开销,并在午夜运行批处理? – SJuan76

+0

最终用途可能会有所不同。它是一个面试问题。尽管运行批处理过程可能是一个非常实用的解决方案,但也许人们已经在使用其他一些聪明的机制来完成它。 –

+0

那么,即使在采访中,我也会回过头来希望得到更简洁的重新设置(更广泛的重新设置 - >成本效益更低的实施)。另一个有趣的问题是,如果有一些共同的列,即使它们不是PK,他们在加入时会派上用场。无论如何,我正在写一个替代答案。 – SJuan76

回答

0

首先,我会告诉你我是怎么看这个问题:

  • 指纹计算为表的关键之一的功能(可能的PK,可也是一个候选人PK)。如果没有,这是没有意义的(* 1)。所以指纹是不变的。
  • 另外,每个表的每个指纹都是唯一的(如果不是很麻烦的话,会有很大的麻烦)。
  • 理想情况下,我会将指纹添加到每个表中作为新属性(NOT NULL UNIQUE),在创建行时由触发器设置。如果表格不太大并且功能不是CPU密集程度太高,那么可以将其更改为计算要在选择中使用的指纹的DB函数。
  • 如果无法修改原始表格,则需要辅助表格。您可以按照您的建议使用唯一的表格,也可以为每个原始表格使用一张表格(fingerprintA,pkA/fingerprintB,pkB)。你的解决方案可能更快,我的更简单(只有插入/删除,没有更新)和更多的扩展(如果表C明天出现)。只有通过在原始表中插入或删除操作(理想情况下通过触发器)才能修改此/ es表的记录。
  • 就像每一个工程一样,问题的细节(你期望对解决方案做什么以及你能做什么)将平衡转向另一个解决方案。

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

+0

指纹不是计算值,它是由数据提供的。说一首歌。歌曲的名称可能会有所不同(由于某些拼写错误),但歌曲的指纹是相同且独特的。因此,即使歌曲S的名称或其他属性在TableA和TableB中不同,指纹仍然保持不变。同样,每张表可能包含具有类似指纹的记录,但现在只是说他们没有。 –

+0

请参阅?要求定义越好,解决方案就越好......因此不需要做太多的工作,可以将每条记录与其指纹在相同的表格或相关表格中链接起来。 – SJuan76

相关问题