首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >推荐的合并数据库记录的技术

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

Stack Overflow用户
提问于 2012-05-24 05:35:02
回答 1查看 1.1K关注 0票数 2

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

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

代码语言:javascript
复制
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。

代码语言:javascript
复制
MergeTable:
int   mergeID
int   originalMainID
int   currentMainID

这是一种好的技术吗?在SQL查询中可以无缝地完成映射吗?有没有我应该考虑的标准或更好的技术呢?

在对这个主题进行研究时,我发现令人惊讶的是,很少有这样的例子。This question很接近,但合并场景与我的不同,至少在我看来是这样。我对数据库略知一二,但我绝对不是专家,所以我可能不知道要搜索的正确术语。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-24 06:00:46

我喜欢您的设计思想,但请考虑在合并表中只存储替换的记录,而不是所有记录。在给定以下查询的情况下,这将减少存储空间并提高速度:

代码语言:javascript
复制
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_CALC_FOUND_ROWS。

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

如果UNION查询太可怕,您也可以使用两个查询来完成此操作。您可以简单地检查记录是否存在,如果不存在,则检查合并表。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10728219

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档