2012-09-17 119 views
1

语言:C#
编译:的Visual Studio 2012
O/S:Windows 7家庭高级版创建时间轴和SQL存储

这里是多数民众赞成了诸多问题问题,并通过一些辩论。
我知道目前有一个功能时间线的临时.net控件,以及关于如何完成一个过程的提示和技巧,但是我还没有发现(迄今为止)一本关于良好维护的SQL-Storage的完整教程时间轴系统。

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

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

+1

使用'DateTime'没有什么问题 - 您只需要知道如何正确使用它(例如总是以UTC存储值,并注意到.NET和MSSQL具有不同的最小值(0001-01-01 vs 1753 -01-01) – Dai

+0

将1个表存储所有这些数据(请注意,有**可能**是一个很大的增长潜力的网站)能够管理,而被查询了很多? – TheGeekZn

回答

2

你描述的内容有时被称为“审计历史” - 它通常使用单一的非规范化表格来实现,但是很多DB纯粹主义者会在你失去强大的输入时反对它。

表看起来是这样的:

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表触发器完成。

要查看用户的口碑历史,你可以这样做:正如我所说

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

现在,这样的设计更加审核,而不是保持一个轻松的用户访问的历史,这些都是缺点:

  • 你不能语义索引的表,所以查找和列表将永远是慢
  • 你存储数据库的元数据作为字符串,所以有很多的开销
  • 没有参照完整性(这可能是一件好事,因为如果重新构建原始表格,数据将保持不变)从用户表中删除信誉字段)

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

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

当然,它确实使代码复杂化,不得不维护这些不同的FooHistory表。

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

+0

哇,这有我很欣赏这样的深度回应 当你说'很多DB纯粹主义者会反对它',你知道他们会争辩吗?当我得到的印象是,审计只是一个解决方案。 – TheGeekZn

+2

你必须是互联网新手 - 人们不会赞成更好的选择,他们只会贬低你提出的任何解决方案H。在这种情况下,他们会引用我提到的缺点 - 唯一真正的选择是为每个想要跟踪的实体属性值随时间推移创建'FooHistory'表。 – Dai

+0

同意。只是试图寻找一线希望:D感谢这个难题的洞察力。 – TheGeekZn