2

我正在寻找一种方法来快速将数据库表的状态与 Web 服务调用的结果进行比较。

我需要确保 Web 服务调用返回的所有记录都存在于数据库中,并且从表中删除数据库中不再存在于 Web 服务响应中的所有记录。

我必须解决的问题:

  1. 如何快速将数据结构与数据库表的结果进行比较?
  2. 当我发现不同之处时,如何快速添加新内容并删除已消失的内容?

对于数字 1,我正在考虑对数据结构进行 MD5 并将其存储在数据库中。如果 MD5 不同,那么我将转到第 2 步。是否有更好的方法将响应数据与数据库状态进行比较?

我需要更多关于数字 2 的指导。我可以轻松地从表中检索所有记录(SELECT * FROM users WHERE user_id = 1),然后循环遍历一个数组,添加数据库中没有的内容并创建另一个要删除的项目数组随后的电话,但我希望这样做更好(更快)。将数据结构与数据库表的子集进行比较和同步的最佳方法是什么?

感谢您对这些问题的任何见解!

4

2 回答 2

1

不要因为过早的优化而自杀。使用一次插入每一行的简单方法。如果您发现在循环时遇到事务问题(例如锁定表的时间过长),您可以先将行插入到临时表中,然后再插入到真正的目标表中。

如果您使用的是 SQL Server,您可以进行批量插入,或将数据打包成 XML,但我仍然强烈建议您先以简单的方式实现它,然后对其进行测试,如果您可以使用生产数据(或相同数量的数据),然后仅在需要时才进行优化。

于 2008-11-18T04:09:31.393 回答
1

我最近陷入了类似的问题。我们(非常简单)的解决方案是将 Web 服务数据加载到与 DB 表具有相同结构的表中。DB 表保留其最重要列的哈希,并且相同的哈希函数应用于 Web 服务表中的相应列。

然后“同步”逻辑如下所示:

  1. 从 Web 服务表中删除任何具有在 DB 表中存在的哈希值的行。这是不需要同步的重复数据。

    DELETE FROM ws_table WHERE hash IN (SELECT hash from db_table);

  2. 从 DB 表中删除任何在 Web 服务表中找不到哈希的行。

    DELETE FROM db_table WHERE hash NOT IN (SELECT hash FROM ws_table);

  3. Web 服务表中剩余的任何内容都是新数据,现在应该插入到 DB 表中。

    INSERT INTO db_table SELECT ... FROM ws_table;

这是一种相当蛮力的方法,如果以事务方式完成(即使只是步骤 2 和 3)在持续时间内锁定数据库表,但它非常简单。

一种改进是使用语句来处理更改的记录UPDATE,但这会增加很多复杂性,并且可能不会比 aDELETE后跟 an快INSERT

另一种可能的优化是设置一个标志而不是删除行。然后可以稍后删除这些行。但是,使用 DB 表的任何逻辑都必须忽略带有设置标志的行。

于 2009-03-15T18:44:07.367 回答