Mysql 合并数据库记录的推荐技术

Mysql 合并数据库记录的推荐技术,mysql,database,design-patterns,database-design,merge,Mysql,Database,Design Patterns,Database Design,Merge,我正在开发一个系统,在这个系统中,数据库记录是根据输入数据流定期创建的。偶尔会出现一些输入,提供证据表明两个独立创建的记录应该合并为一个记录。我正在寻找如何在数据库中实现合并的建议 主表(目前只是一个设计)包含由唯一ID(称之为主ID,由数据库分配,在我的系统中是MySQL)和一些数据字段组成的记录。还有一些其他表使用主ID将其记录链接到主表中的记录 MainTable: int mainID blob data ... OtherTable: int otherID int m

我正在开发一个系统,在这个系统中,数据库记录是根据输入数据流定期创建的。偶尔会出现一些输入,提供证据表明两个独立创建的记录应该合并为一个记录。我正在寻找如何在数据库中实现合并的建议

主表(目前只是一个设计)包含由唯一ID(称之为主ID,由数据库分配,在我的系统中是MySQL)和一些数据字段组成的记录。还有一些其他表使用主ID将其记录链接到主表中的记录

MainTable:
int   mainID
blob  data
...

OtherTable:
int   otherID
int   mainID
blob  otherData
...
现在,如果每个记录从未被共享给任何外部进程或系统,那么以某种方式将一个记录中的数据字段混合到另一个记录中并删除该记录是很简单的。将其他表中的主ID字段更新为我们保留的主ID值也很简单(如果繁琐和/或低效)

当每个记录的ID都在系统外共享时,事情就变得复杂了。在这种情况下,我认为使用这些已删除ID的查询只会失败是不合理的,尽管我可以确信不是这样

我正在考虑的一个想法是引入一个包含两个关键字段的合并表:原始主ID和当前主ID。其目的是将一个主ID别名到另一个主ID。在创建每个主表记录时,我们向合并表添加一条记录,将新创建的主表记录的主ID映射到其自身。如果发生合并,我们只需使用正在合并的主记录的原始主ID更新合并表中记录的当前主ID字段。然后,对于基于主ID的每个查询,我们通过合并表映射该ID,以找到我们真正应该使用的有效主ID

MergeTable:
int   mergeID
int   originalMainID
int   currentMainID
这是一种好技术吗?映射可以在SQL查询中无缝完成吗?我是否应该考虑采用标准或更好的技术


在这方面的研究中,我发现令人惊讶的是,这方面的例子很少。很接近,但是合并场景与我的不同,或者在我看来是这样的。我对数据库有点了解,但我决不是专家,所以我可能不知道要搜索的正确术语。

< P>我喜欢你的设计思想,但是考虑一下你只在合并表中存储替换的记录,而不是全部。考虑到以下查询,这将减少存储并提高速度:

SELECT *
  FROM MainTable
  WHERE mainID = 1
UNION ALL
SELECT MainTable.*
  FROM MergeTable
  INNER JOIN MainTable
    ON MainTable.mainID = MergeTable.currentMainID
  WHERE MergeTable.originalMainID = 1
LIMIT 1
其思想是,在大多数情况下,第一个查询将成功并返回一个结果,而MySQL将中止第二个查询,因为满足了限制。如果第一个查询没有返回任何结果,那么它将继续执行第二个查询,并对合并表执行联接,以查看它是否已被合并

根据MySQL,关于限制:

一旦MySQL向客户端发送了所需数量的行, 它将中止查询,除非您正在使用SQL\u CALC\u FOUND\u行

如果合并的记录是例外,而不是规则,那么这将保存很多很多连接


如果UNION查询太可怕,您还可以通过两个查询来实现这一点。您只需检查记录是否存在,如果不存在,则检查合并表。

回答不错,Marcus+1.我希望社区能有更多的回应。你愿意推测一下为什么我的问题没有引起什么兴趣吗?是太难还是太少(如果是,为什么?)?谢谢。@RandallCook,我一直在我们的一个特定系统中执行这样的查询。我运行一个查询,如果没有得到任何结果,我将对另一个表运行另一个查询。我不认为这太不寻常。这里的问题是不确定的。有时一个冗长的问题会让人不快,有时这只是一天中的一个糟糕的时刻。@RandallCook,我忘了提到你总是会不接受我的答案,然后发布一份奖励以获得更好的答案。