存储审计存储

时间:2011-06-28 19:25:29

标签: .net sql entity-framework auditing

为了存储用于审计目的的审计条目,我一直在努力解决如何记录哪些数据发生了变化。

我过去曾做过两种不同的方式,但我现在正在创建一个新系统,并试图弄清楚要使用哪种方式:

  1. 拥有AuditEntry和AuditEntryChange表。每个更改的字段值都在AuditEntryChange表中,并且具有到AuditEntry的FK。

  2. 将更改的字段和值存储在AuditEntry表中的XML中的单个字段中。

  3. 以上哪项更适合保存和查询? (如果使用XML,则包括序列化/反序列化的影响)。哪个会占用更少的空间?

    此外,最佳做法是将GUID或int PK用于审计表吗?我可以想到每个原因。

2 个答案:

答案 0 :(得分:1)

就个人而言,报告数据库中的每个字段要容易得多。

GUID与整数取决于您将在表格中拥有多少条记录。对于GUID,整数需要4个字节而不是16个字节。如果您希望跨服务器部署,虽然GUID更容易。

Here is a good article on the pro's versus con's.

答案 1 :(得分:1)

答案取决于您计划查询审计表的方式。有关审计表的注意事项是,在典型情况下,记录是只读的,插入的频率远远超过查询。

由于以下原因,我倾向于选项2:

  • 插入单行比插入具有外键约束的多行更快。
  • 拥有XML字段可为审计数据的结构提供极大的灵活性,而无需担心数据库架构。
  • SQL Server可以使用XPath语法查询XML列,因此您仍然可以拥有一些关系查询功能。
  • 选择许多记录(例如在表单中显示)也更快,因为没有连接。
  • 无需NoSQL存储即可轻松移植此模型。
  • 只有从代码插入或加载回代码时才会涉及XML序列化。您仍然可以通过SQL直接查询XML列。
  • 我认为空间需求会增加,但这取决于关系模型可能导致的索引大小。

对于审计表的int vs Guid,我会选择Guid,因为:

  • 如果使用像NHibernate这样的ORM插入,则在插入后没有select来检索生成的ID。您可以有效地批量插入。
  • 虽然guid是4倍大,但是对于100万条记录而言,差异大约为10 MB。这真的是个问题吗?特别是因为它不太可能通过PK查询审核日志。
  • 移植到其他数据库或存储机制更容易。