0

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

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

  1. 有一个 AuditEntry 和 AuditEntryChange 表。每个更改的字段值都进入 AuditEntryChange 表,并具有到 AuditEntry 的 FK。

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

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

此外,对审计表使用 GUID 或 int PK 的最佳做法是什么?我能想到每一个原因。

4

2 回答 2

1

就个人而言,对于报告来说,将每个字段都放在数据库中要容易得多。

GUID 与整数取决于您将在表中拥有多少条记录。整数占用 4 个字节,而 GUID 占用 16 个字节。如果您希望进行跨服务器部署,但 GUID 会容易得多。

这是一篇关于赞成与反对的好文章。

于 2011-06-28T19:31:43.303 回答
1

答案取决于您计划如何查询审计表。关于审计表要考虑的事情是,在典型情况下,记录是只读的,并且插入的频率远高于查询的频率。

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

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

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

  • 如果使用像 NHibernate 这样的 ORM 插入,则插入后没有选择来检索生成的 ID。您可以有效地批量插入。
  • 虽然 guid 大 4 倍,但对于一百万条记录,这会导致大约 10 MB 的差异。这真的是个问题吗?特别是因为它不太可能通过审计日志的 PK 来查询。
  • 移植到其他数据库或存储机制更容易。
于 2011-06-28T20:19:02.707 回答