【发布时间】:2010-12-02 16:12:09
【问题描述】:
我有一个集成项目的数据库架构,我需要能够在其中查询已更改的记录,但仅基于给定的一组字段那个记录。
因此,例如,这是一个示例表:
客户
- 身份证
- 姓名
- 电话
- 传真
- 余额
我需要查询以获取姓名、电话或传真字段已更改的记录。但是,不应考虑其他字段,即如果只是余额字段发生变化,我的查询不应将该记录拉入(因此,时间戳字段会自动更新每当修改记录时不起作用)。
此外,这必须在许多不同的数据库和平台上运行,因此除非它们将在 MySQL、PostgreSQL、SQL Server 和 SQLLite 上运行,否则 TRIGGERS 或类似的东西并不是真正的选择。
这些字段是由我无法修改的第三方应用程序修改的,因此我不能只添加一个标志并让第三方应用程序在修改相关字段时将该标志设置为 TRUE。
我对此的初步解决方案是计算相关字段的 HASH 并将其存储在新字段“LastHash”或其他内容中。然后,我可以为当前记录中的数据计算相关字段的哈希,如果它与存储的 LastHash 不匹配,我知道它已经改变了。
这看起来很混乱......但它似乎会起作用。有没有更好的办法?如果没有,是否有一种实现该哈希的好方法,以便提取那些更改的记录既高效又不会太耗时?
编辑
一些澄清:我的应用程序和另一个应用程序都更新并插入到这些表中。我可以让我的应用程序计算初始哈希值。我不能让其他应用程序计算它。
只要记录更改可行,时间戳列就会自动更新,这些列很容易使用不同的列类型或非常简单的触发器在所有数据库系统中复制。
其他问题
如果散列是要走的路……有没有一种高效的散列算法不会永远计算所有这些记录? MD5 或 SHA1 可能有效,但它们似乎会是 slllowwww。
【问题讨论】:
-
如何在不使用触发器或修改执行插入的应用程序的情况下插入/更新该哈希?
-
编辑:我可以让我的应用程序计算初始哈希值。我不能让其他应用程序计算它。