我有一个集成项目的数据库架构,我需要能够在其中查询已更改的记录,但仅基于给定的一组字段那个记录。
例如,这是一个示例表:
客户
- 身份证
- 姓名
- 电话
- 传真
- 余额
我需要查询以获取名称、电话或传真字段已更改的记录。但是,不应考虑其他字段,即,如果仅 Balance 字段更改,我的查询不应提取该记录(因此,时间戳字段会自动更新每当修改记录时不起作用)。
此外,这必须在许多不同的数据库和平台上运行,因此 TRIGGERS 或类似的东西并不是真正的选择,除非它们将在 MySQL、PostgreSQL、SQL Server 和 SQLLite 上运行。
这些字段由我无法修改的第三方应用程序修改,所以我不能只添加一个标志,让第三方应用程序在修改相关字段时将标志设置为 TRUE。
我最初的解决方案是计算相关字段的哈希并将其存储在新字段“LastHash”或其他字段中。然后,我可以为记录中的当前数据计算相关字段的哈希值,如果它与存储的 LastHash 不匹配,我就知道它被更改了。
这看起来很乱......但它似乎会起作用。有没有更好的办法?如果没有,是否有实现该散列的好方法,以便提取那些已更改的记录既高效又不会太耗时?
编辑
一些说明:我的应用程序和其他应用程序都更新并插入到这些表中。我可以让我的应用程序计算初始散列。我不能让其他应用程序计算它。
只要记录发生更改,时间戳列就会自动更新,这些列很容易在所有数据库系统中使用不同的列类型或非常简单的触发器进行复制。
附加问题
如果散列是可行的方法...是否有任何一种高效的散列算法不会永远计算所有这些记录? MD5 或 SHA1 可能有效,但它们看起来像sllloowwww。
最佳答案
这是一个艰难的过程。您仍然需要进行表扫描(或索引扫描),因为您必须计算新哈希并将其与存储的旧哈希进行比较。
如果由于跨平台问题而无法使用触发器,您可以让数据库引擎计算当前哈希值(即持久化计算列 - 就像触发器一样有效)。不过,这也是跨平台问题!然后,如果您索引当前哈希和您的哈希,这是一个相对容易的搜索。
至少可以使用时间戳字段来减少需要检查的哈希数吗?
要记住的另一件事是,没有完美的哈希函数这样的东西,因此您可能会出现漏报(无意的哈希冲突导致未检测到更改)。值得冒这个(天文数字上的小)风险吗?
关于database - 实现数据库记录哈希以跟踪记录是否已更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1498416/