Database design 完全可审核数据模型的最佳实现?

Database design 完全可审核数据模型的最佳实现?,database-design,data-modeling,Database Design,Data Modeling,我的需求是一个数据模型,在这个模型中,每个对象的每个属性的更改都会保留完整的审计跟踪。对象定义也是流动的:随着时间的推移,新属性可能会出现或消失。此审计跟踪将与原始数据库分开,因此基于触发器的审计模型将不起作用 在关系数据库中,我可以使用一个大型属性历史表来实现这一点,该表记录每个属性的每个单独更改,并带有适当的时间戳和责任字段 我的问题:在这方面,是否有任何较新的存储模型(BigTable、HBase、CouchDB、RDF stores等)优于RDBMS?您还可以在应用程序代码中创建日志记录

我的需求是一个数据模型,在这个模型中,每个对象的每个属性的更改都会保留完整的审计跟踪。对象定义也是流动的:随着时间的推移,新属性可能会出现或消失。此审计跟踪将与原始数据库分开,因此基于触发器的审计模型将不起作用

在关系数据库中,我可以使用一个大型属性历史表来实现这一点,该表记录每个属性的每个单独更改,并带有适当的时间戳和责任字段


我的问题:在这方面,是否有任何较新的存储模型(BigTable、HBase、CouchDB、RDF stores等)优于RDBMS?

您还可以在应用程序代码中创建日志记录系统。记录对修改数据库并导致成功提交的每个函数的调用


回答您的问题:不,只需使用RDBMS。在日志上运行查询会更容易。

我看不出触发器不能引用其他数据库的原因。但是,如果该数据库不可用,则所有更改都将失败。如果审核数据库位于另一台服务器上且连接已关闭,则可能会出现问题。但是我们的审计是通过触发器进行的,我们有一个单独的审计数据库。

我认为对于审计日志来说,一个特定的数据库范例不能被认为优于任何其他数据库范例。与其说它是一个数据模型问题,不如说它是一个日志问题,可以认为它与数据存储有点正交

也就是说,CouchDB可以配置为从不删除旧版本的文档。通过向每个文档添加时间戳和可能的用户字段,您可以使用该功能自动保存数据库中存储的所有对象的完整历史记录。这可能是数据库中最简单的审计日志设置

至于其他人,我不知道他们对此会有什么样的支持

注意事项:

(对于数据库中的对象,您还必须遵循从不删除策略,只需标记已删除的对象即可)


(对于RDBMS,最简单的解决方案可能是一个简单的表,它将数据库上运行的每个insert、update或delete语句记录在一个带有时间戳和用户字段的文本字段中。我曾经在postgres数据库上这样做过,它在保存历史记录方面非常有效)

创建一个表,该表包含要审核的表的名称(例如:AuditTable);最小列应为:TableName(varchar)、RandomValue(float)。在AuditTable上添加一个触发器,该触发器将在RandomValue更改时触发-此触发器的任务是为AuditTable中列出的每个表(TableName)动态删除并重新创建审核触发器。审核触发器(针对每个表)应插入到AuditRecord表中,该表捕获:表名、主键ID、操作类型(插入/更新/删除),原始字段值和更新的字段值。如果表结构发生更改,则AuditTable中的RandomValue的简单更新将导致触发器重新生成。您需要编写代码,为给定表自动生成触发器;建议在每个被审核的表上只使用1个主整数键。

Perf这种审计追踪将关注绩效。 我会选择一个缓存(非常容错),并在需要时持久化缓存内容 计数达到一定的阈值(比如1000条记录)。这将是一个理想的批量更新


我觉得内存中的数据库具有持久性选项(如H2)也应该这样做。但我自己没有使用过。

如何存储数据的问题取决于如何使用数据以及其他问题。我建议使用一些您现在了解的简单方法,测试您是否了解预期的可能负载。然后在将来根据需要进行改进


关于基于触发器的审核系统的问题,因为听起来您似乎要在数据库级别完成工作,所以我有一个建议。使用触发器记录数据库中表的更改,然后隔夜(或无论多么频繁)处理表的内容,并在存储该表的任何位置创建审计跟踪,并清空数据库中表的内容。这样,您可以在数据库级别捕获更改,但仍然满足将实际审计跟踪存储在其他位置的要求。

应用程序中的审计问题在于,并非对数据的所有更改ta发生在应用程序中。在我看来,将审计仅仅放在应用程序中是一种非常糟糕的做法。