创建时间轴和SQL存储

时间:2012-09-17 15:48:23

标签: c# asp.net sql-server

语言:C#
编译器:Visual Studio 2012
O / S:Windows 7 Home Premium

这是一个关于许多问题和一些辩论的问题 我知道目前有功能时间轴的临时.net控件,以及关于如何完成一个过程的提示和提示,但我还没有找到(到目前为止)一个维护良好的SQL存储时间轴系统的完整教程

我需要记录我的网站几乎所有的变化。从添加到用户声誉,到加入/创建和最终提交的成员,部落游戏等 据我所知,应避免在SQL数据库中使用 DateTime ,尤其是大量数据。

时间轴的实现,流程和最终输出是什么?

1 个答案:

答案 0 :(得分:2)

您所描述的内容有时被称为“审核历史记录” - 它通常使用单个非规范化表格来实现,但是当您丢失强类型时,许多数据库纯粹主义者会反对它。

表格如下:

AuditTable( EventId bigint, DateTime datetime, Subject nvarchar, Table varchar, Column varchar, TablePK bigint, OldValueInt bigint nullable, OldValueStr nvarchar nullable )
-- add more nullable columns for more types, if necessary

每次更改某个值(例如用户的声誉增加)时,您都会在此表中添加一行,例如:

INSERT INTO AuditTable( Now(), N'User reputation increased', 'Users', 'Reputation', @userId, 100 )

您只需要存储旧值(更改前的值),因为新的(即当前)值将位于实际的表行中。

使用SQL Server表触发器可以完全自动添加到Audit表。

要查看用户的信誉记录,请执行以下操作:

SELECT * FROM AuditTable WHERE Table = 'Users' AND Column = 'Reputation' AND TablePK = @userId

正如我所说,这个设计更多的是用于审核而不是维护一个易于用户访问的历史记录,这些都是缺点:

  • 您无法对表进行语义索引,因此查找和列表将始终很慢
  • 您将数据库元数据存储为字符串,因此存在大量开销
  • 没有引用完整性(这可能是一件好事,因为如果重新构建原始表,数据将保留,例如从Users表中删除信誉字段)

如果您想要更“纯粹”,那么您必须设计一个直接支持您要构建的历史记录跟踪的表结构。您不需要为每个字段创建历史表 - 即使Stackoverflow也不存储所有内容的历史记录。例如:

 UserReputationHistory ( UserId bigint, ReputationChange int, DateTime when, Subject nvarchar )

当然,为了维护这些不同的FooHistory表,它会使代码复杂化。

您在原始问题中注释的其他内容(例如成员的加入日期)不需要历史记录表,您可以从成员自己的数据库行中的DateJoined字段获取该值。