English 中文(简体)
合并数据库记录的建议方法
原标题:recommended techniques for merging database records

我正在建立一个系统,在这个系统中,根据数据输入流定期建立数据库记录。 偶尔会有一些输入提供证据,证明两个独立创建的记录应该合并成一个。 我正在寻找关于如何合并到数据库的建议。

主表格(目前只是一种设计)包含由独有的识别码(称为主识别码,由数据库指定,我系统中的 MySQL)和一些数据字段组成的记录。还有其他一些表格使用主识别码将其记录与主表格中的记录连接。

MainTable:
int   mainID
blob  data
...

OtherTable:
int   otherID
int   mainID
blob  otherData
...

现在,如果每个记录从未向任何外部进程或系统共享过,那么将数据字段从一个记录混为一谈,并删除一个记录就直截了当。 将其他表格中的主要ID字段更新到我们保存的主要ID值也是直截了当的(如果是乏味和(或)效率低下的话 )。

当每份记录的身份证明在系统之外共享时,事情就变得复杂了。 在这种情况下,我认为对那些被删除的身份证明的查询完全失败是没有道理的,尽管我可以说服别人。

我考虑的一个想法是引入一个包含两个关键字段的合并表格:和原始主 ID 和当前主 ID 。 其宗旨是将别名从一个主 ID 到另一个主 ID 。 随着每个主 表格记录创建, 我们将在合并表格中添加一个记录, 将新创建的主 表格记录的主要 ID 映射到它本身。 如果合并, 我们只需将合并表格中当前主 ID 字段更新到合并表格中的记录中, 与正在合并的主要记录原主 ID 一起更新 。 然后, 对于基于主 ID 的每一项查询, 我们通过合并表格绘制该 ID 以找到我们真正应该使用的有效的主 ID 。

MergeTable:
int   mergeID
int   originalMainID
int   currentMainID

这是否是一种好技术? SQL 查询中是否能够无缝地进行绘图?我是否应该考虑采用标准或更好的技术?

在研究这个专题时,我发现了一些令人惊讶的例子。

最佳回答

我喜欢你的设计想法,但想想一个你只存储在合并表格中替换记录的地方,不是全部。这可以减少存储并加快速度,因为有以下查询:

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将中止自完成 LIMIT 后第二个查询。 如果第一个查询返回没有结果, 那么它会继续到第二个查询, 然后在合并表格上执行连接以查看它是否被合并 。

MySQL指出,

As soon as MySQL has sent the required number of rows to the client, it aborts the query unless you are using SQL_CALC_FOUND_ROWS.

如果合并记录是例外,而不是常规,那么这将节省许多、很多的合并。

如果 UION 查询太可怕, 您也可以用两个查询来这样做。 您可以简单地检查一下记录是否存在, 如果不存在, 然后检查合并表 。

问题回答

暂无回答




相关问题
SQL SubQuery getting particular column

I noticed that there were some threads with similar questions, and I did look through them but did not really get a convincing answer. Here s my question: The subquery below returns a Table with 3 ...

please can anyone check this while loop and if condition

<?php $con=mysql_connect("localhost","mts","mts"); if(!con) { die( unable to connect . mysql_error()); } mysql_select_db("mts",$con); /* date_default_timezone_set ("Asia/Calcutta"); $date = ...

php return a specific row from query

Is it possible in php to return a specific row of data from a mysql query? None of the fetch statements that I ve found return a 2 dimensional array to access specific rows. I want to be able to ...

Character Encodings in PHP and MySQL

Our website was developed with a meta tag set to... <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> This works fine for M-dashes and special quotes, etc. However, I ...

Pagination Strategies for Complex (slow) Datasets

What are some of the strategies being used for pagination of data sets that involve complex queries? count(*) takes ~1.5 sec so we don t want to hit the DB for every page view. Currently there are ~...

Averaging a total in mySQL

My table looks like person_id | car_id | miles ------------------------------ 1 | 1 | 100 1 | 2 | 200 2 | 3 | 1000 2 | 4 | 500 I need to ...