我的要求是数据模型,其中保留完整的审计跟踪以更改每个对象的每个属性。对象定义也很流畅:新属性可能随着时间的推移而出现或消失。此审计跟踪将与原始数据库分开存在,因此基于触发器的审计模型将不起作用。
在关系数据库中,我可以使用一个大的ATTRIBUTE_HISTORY表来实现它,该表记录每个属性的每个更改,并带有适当的时间戳和职责字段。
我的问题:为此目的,是否有任何较新的存储模型(BigTable,HBase,CouchDB,RDF存储等)优于RDBMS?
答案 0 :(得分:3)
如何存储数据的问题取决于如何在其他问题中使用它。我建议你做一些你现在理解的简单的事情,测试你是否知道你期望的可能负担。然后在将来进行必要的改进。
关于基于触发器的审核系统的问题,因为听起来你已经开始在数据库级别完成工作,我有一个建议。使用触发器记录对数据库中表的更改,然后一夜之间(或者经常)处理表的内容并在存储任何位置创建审计跟踪并清空数据库中表的内容。这样,您可以捕获数据库级别的更改,但仍满足将实际审计跟踪存储在其他位置的要求。
答案 1 :(得分:1)
我认为没有理由说触发器无法引用不同的数据库。但是,如果该数据库不可用,则所有更改都将失败,如果审计数据库位于另一台服务器上并且conectin已关闭,则可能会出现问题。但我们的审计是通过触发器进行的,我们有一个单独的审计数据库。
答案 2 :(得分:0)
您还可以在应用程序代码中创建日志记录系统。记录对每个修改数据库的函数的调用,并导致成功的COMMIT。
回答你的问题:不,只需使用RDBMS即可。在日志上运行查询会更容易。
答案 3 :(得分:0)
我不认为特定的数据库范例可以被认为优于任何其他审计日志。它不是一个数据模型问题,因为它是一个日志问题,可以认为与数据存储有点正交。
据说CouchDB可以配置为永不删除旧版本的文档。通过为每个文档添加时间戳和可能的用户字段,您可以使用该功能自动保留数据库中存储的所有对象的完整历史记录。这可能是您可以在数据库中获得的最简单的开箱即用设置。
至于其他人,我不知道他们对此有何支持。
注意事项:
(您还必须遵循数据库中对象的永不删除策略,而只是标记删除的对象)
(对于RDBMS,最简单的解决方案可能是一个简单的表,它记录在带有时间戳和用户字段的文本字段中的数据库上运行的每个插入,更新或删除语句。我在postgres数据库上执行了一次,它工作正常很好地保持历史)
答案 4 :(得分:0)
创建一个表,其中包含您要审核的表的名称(例如:AuditTable);最小列应为:TableName(varchar),RandomValue(float)。在AuditTable上添加触发器,只要RandomValue发生更改,该触发器将触发 - 此触发器的作业将是动态删除,为AuditTable中列出的每个表(TableName)重新创建审计触发器。审计触发器(对于每个表)应插入到AuditRecord表中,该表捕获:表名,主键ID,操作类型(INSERT / UPDATE / DELETE),原始字段值和更新的字段值。如果表结构发生更改,则AuditTable中RandomValue的简单更新将导致触发器重新生成。您需要编写自动生成给定表的触发器的代码;建议在每个被审计的表上只使用1个主整数键。
答案 5 :(得分:0)
性能将成为此类审计跟踪的关注点。 我会去一个缓存(这是非常容错的)并保留缓存内容 计数达到一定的阈值(比如说1000条记录)。理想情况下,这将是批量更新。
我觉得具有持久性选项(如H2)的内存数据库也应该这样做。但我自己没有用过它。