实现数据库记录哈希以跟踪记录是否已更改

时间:2009-09-30 14:19:27

标签: database hash

我有一个集成项目的数据库模式,我需要能够在其中查询已更改但仅基于给定字段集的记录那条记录。

因此,例如,这是一个示例表:

客户

  • ID
  • 名称
  • 电话
  • 传真
  • 余额

我需要查询以获取其名称,电话或传真字段已更改的记录。但是,不应考虑其他字段,即如果只是平衡字段更改,我的查询不应拉入该记录(因此,一个自动更新的时间戳字段每当记录被修改不起作用)。

此外,这必须在许多不同的数据库和平台上运行,因此TRIGGERS或类似的东西不是真正的选择,除非它们可以在MySQL,PostgreSQL,SQL Server和SQLLite上运行。

这些字段由我无法修改的第三方应用程序修改,因此我不能只添加一个标志,并且只要第三方应用程序修改相关字段,就将该标志设置为TRUE。

我对此的初步解决方案是计算相关字段的HASH并将其存储在新字段“LastHash”中。然后,我可以计算当前记录中数据的相关字段的哈希值,如果它与存储的LastHash不匹配,我知道它已被更改。

这看起来很混乱......但似乎它会起作用。有没有更好的办法?如果没有,是否有一种很好的方法来实现该哈希,因此提取这些更改的记录是有效的,而不是太耗时?

修改

一些说明:我的应用程序都会更新并插入到这些表中。我可以让我的应用程序计算初始哈希值。我不能让其他应用程序计算它。

只要记录发生变化就会自动更新的时间戳列,这些列很容易在使用不同列类型或非常简单的触发器的所有数据库系统中进行复制。

其他问题

如果要进行散列...是否有任何类型的高效散列算法不会永远计算所有这些记录? MD5或SHA1可能有效,但看起来他们似乎是 sllloowwww

2 个答案:

答案 0 :(得分:2)

这是一个艰难的。您仍然需要进行表扫描(或索引扫描),因为您必须计算新的哈希并将其与存储的旧哈希进行比较。

如果由于跨平台问题而无法触发,您可能可以让数据库引擎计算当前哈希值(即持久计算列 - 有效地类似于触发器)。不过这也是跨平台的问题!然后,如果您索引当前哈希值和哈希值,则搜索相对容易。

您是否至少可以使用timestamp字段来减少需要检查的哈希数?

要记住的另一件事是没有完美的哈希函数,所以你可能会有错误的否定(无意的哈希冲突会导致无法检测到更改)。是(天文学上很小)风险值得吗?

答案 1 :(得分:0)

我会标准化应用程序如何检查差异,而不是数据库如何实现它。尝试使用具有表示更改的特定列的视图。然后使用每个数据库中实现的适当技巧使该视图成为现实。依赖于检查此差异的代码将使用相同的视图和列相同。