.net 存储审核存储

.net 存储审核存储,.net,sql,entity-framework,auditing,.net,Sql,Entity Framework,Auditing,为了存储用于审计目的的审计条目,我一直在努力记录哪些数据发生了更改 过去我用过两种不同的方法,但现在我正在创建一个新系统,并试图找出使用哪种方法: 有一个AuditEntry和AuditEntryChange表。每个更改的字段值都会出现在AuditEntryChange表中,并有一个FK到AuditEntry 将更改后的字段和值存储在单个字段的AuditEntry表中的XML中 以上哪一项在保存和查询方面更有效?(包括使用XML时序列化/反序列化的影响)。哪一个会占用更少的空间 另外,对审核表使

为了存储用于审计目的的审计条目,我一直在努力记录哪些数据发生了更改

过去我用过两种不同的方法,但现在我正在创建一个新系统,并试图找出使用哪种方法:

  • 有一个AuditEntry和AuditEntryChange表。每个更改的字段值都会出现在AuditEntryChange表中,并有一个FK到AuditEntry

  • 将更改后的字段和值存储在单个字段的AuditEntry表中的XML中

  • 以上哪一项在保存和查询方面更有效?(包括使用XML时序列化/反序列化的影响)。哪一个会占用更少的空间


    另外,对审核表使用GUID或int PKs的最佳实践是什么?我能想到每个字段的原因。

    就我个人而言,在数据库中包含每个字段更容易报告

    GUID与整数取决于表中的记录数。整数占用4个字节,而GUID占用16个字节。如果您希望进行跨服务器部署,尽管guid要容易得多


    答案取决于您计划如何查询审核表。审计表需要考虑的是,在一个典型的场景中,记录是只读的,插入比查询要频繁得多。 出于以下原因,我倾向于选择方案2:

    • 插入单行比插入具有外键约束的多行快
    • 拥有一个XML字段可以在审计数据的结构方面提供很大的灵活性,而不必担心数据库模式
    • SQLServer可以使用XPath语法查询XML列,因此您仍然可以拥有一些关系查询功能
    • 选择许多记录(例如在表单中显示)也会更快,因为没有联接
    • 该模型可以轻松移植,无需NoSQL存储
    • 只有在从代码插入或加载回代码时,才会涉及XML序列化。您仍然可以通过SQL直接查询XML列
    • 我假设空间需求会增加,尽管这取决于关系模型可能产生的索引的大小
    至于审计表的int vs Guid,我将使用Guid,因为:

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

    对Guid问题的评论很好。谢谢