【问题标题】:Implementing a database record hash for keeping track of whether a record has changed or not实现数据库记录哈希以跟踪记录是否已更改
【发布时间】:2010-12-02 16:12:09
【问题描述】:

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

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

客户

  • 身份证
  • 姓名
  • 电话
  • 传真
  • 余额

我需要查询以获取姓名、电话或传真字段已更改的记录。但是,不应考虑其他字段,即如果只是余额字段发生变化,我的查询不应将该记录拉入(因此,时间戳字段会自动更新每当修改记录时不起作用)。

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

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

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

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

编辑

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

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

其他问题

如果散列是要走的路……有没有一种高效的散列算法不会永远计算所有这些记录? MD5 或 SHA1 可能有效,但它们似乎会是 slllowwww

【问题讨论】:

  • 如何在不使用触发器或修改执行插入的应用程序的情况下插入/更新该哈希?
  • 编辑:我可以让我的应用程序计算初始哈希值。我不能让其他应用程序计算它。

标签: database hash


【解决方案1】:

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

【讨论】:

  • 将列拆分为两个表不是选项。我无法更改其他第三方应用程序以适应该数据库更改。
【解决方案2】:

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

如果由于跨平台问题而无法使用触发器,您可以让数据库引擎计算当前哈希(即持久化计算列 - 就像触发器一样有效)。不过,这也是跨平台的问题!那么如果你索引当前的哈希和你的哈希,它是一个相对容易的搜索。

您至少可以使用时间戳字段来减少需要检查的哈希数吗?

要记住的另一件事是,没有完美的哈希函数,因此您可能会出现误报(无意的哈希冲突导致未检测到更改)。是否值得冒这个(天文数字般的小)风险?

【讨论】:

  • 将时间戳与哈希一起使用的想法很好,我喜欢。那应该保持性能更好。我认为发现哈希冲突的可能性非常低。如果我发现 MD5 不够,我可以使用 SHA1 或其他东西。
  • 如果您不需要,请不要使用单向加密哈希。 MD5 和 SHA1(虽然易受攻击)被设计为加密哈希。使用 CRC32 或 CRC64 之类的东西会更高效。
  • @scotru - CRC 不应用于更改跟踪。我基于此评论:stackoverflow.com/a/7509974/1631910
猜你喜欢
  • 1970-01-01
  • 2012-09-15
  • 2021-12-06
  • 1970-01-01
  • 2013-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-02
相关资源
最近更新 更多