【发布时间】:2014-10-01 05:04:55
【问题描述】:
我正在尝试彻底检查我的 CRUD 应用程序的日志记录架构。它是一个带有 SQL Server 2008 R2 后端的 .NET Winforms 应用程序。
在当前设置中,只要用户按下“保存按钮”,就会调用数据库日志。变更集是使用 .NET 对表示我们存储在 SQL 中的表的类的反射来确定的。
日志存储在两个名为 ActionLogHeader 和 ActionLogDetail 的表中。
标头架构:
ActionLogHeader_id | TableName | PrimaryKey | ActionType | User | ActionDate
详细架构:
ActionLogDetail_id | ActionLogHeader_id | ColumnChanged | PreValue | PostValue
单个标头可以有多个详细信息。每个详细信息行代表表中更改的单个列。 ActionType 是插入/更新/删除/查看。
这通常适用于向用户显示我们数据库中任何一件事发生的更改列表。但是很难从中提取数据来创建一个完整的图片,了解任何时候某物的样子。对特定数据点的这些数据进行聚合是很困难的。
我们已经探索过将这些数据从 SQL Server 转移到 Hadoop/HBase 中,但我觉得我们所做的只是在不改变结构的情况下转移数据。我们已经展平了表并添加了更多列,因此从 SQL 获取数据不会成为问题。但是对数据进行任何类型的分析仍然需要一个 MapReduce 工作,这很难设置。
所以我对其他人在记录日志方面所做的事情很感兴趣。有更好的策略吗?我已经看到很多人喜欢在数据库级别使用触发器来记录更改,但我不知道这会如何影响性能。我不知道从这里去哪里。
【问题讨论】:
-
有时我们只是将“post”对象序列化为 JSON/XML,为其提供一些元数据,然后将单个条目转储到表中。如果您想知道发生了什么变化,您可以拉出当前行和之前的行,并对序列化数据进行比较,然后将其显示给用户。
-
我不喜欢您所描述的 EAV 风格的日志记录,因为您正遇到这种情况。创建表的时间点视图几乎是不可能的。触发器是一种选择,但它会变得非常麻烦,因为您必须向每个表添加触发器。这也增加了对新表等的系统测试。当然,如果触发器写得不好,它们会对性能产生重大影响。另一种选择是 CDC(更改数据捕获)。这不是猫的叫声,因为这里也有一些限制,但可能值得探索。
-
@Cory 你是在建议把整行都扔到某个地方?有点像快照?
标签: .net sql-server logging hadoop