Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 创建时间线和SQL存储_C#_Asp.net_Sql Server - Fatal编程技术网

C# 创建时间线和SQL存储

C# 创建时间线和SQL存储,c#,asp.net,sql-server,C#,Asp.net,Sql Server,语言:C# 编译器:Visual Studio 2012 操作系统:Windows 7家庭高级版 这是一个在许多问题上讨论过的问题,也经过了一些辩论。 我知道目前有用于功能时间线的临时.net控件,以及关于如何完成流程的提示和提示,但我还没有找到(到目前为止)关于维护良好的SQL存储时间线系统的完整教程 我需要记录我的网站将有几乎每一个变化。从增加用户声誉到加入/创建和最终提交会员、部族游戏等 据我所知,应该避免在SQL数据库中使用日期时间,尤其是大量使用日期时间 时间线的实现、过程和最终输出是

语言:C#
编译器:Visual Studio 2012
操作系统:Windows 7家庭高级版

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

我需要记录我的网站将有几乎每一个变化。从增加用户声誉到加入/创建和最终提交会员、部族游戏等
据我所知,应该避免在SQL数据库中使用日期时间,尤其是大量使用日期时间


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

您所描述的有时被称为“审核历史”-通常使用一个非规范化的表来实现,但是许多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表确实会使代码复杂化


您在原始问题中评论的其他内容,例如成员的加入日期不需要历史记录表,您可以从成员自己的DB行中的
DateJoined
字段中获得

使用
DateTime
,没有什么错-您只需要知道如何正确使用它(例如始终以UTC存储值,并注意.NET和MSSQL具有不同的最小值(分别为0001-01-01和1753-01-01)。是否有一个表来存储所有这些数据(注意,该站点可能有很大的增长潜力)能够管理,而被问了很多?哇,这是令人惊讶的洞察力,我真的很欣赏这样一个深入的回应。当你说“许多DB纯粹主义者会反对它”,你知道他们会争论什么吗?因为我得到的印象是审计只是一个解决方案。你必须是新的互联网-人们不会争论为了更好的选择,他们只会轻视你提出的任何解决方案。在这种情况下,他们会引用我提到的缺点-唯一真正的选择是为你想跟踪的每个实体属性值费力地创建
FooHistory
表。同意。我只是想寻找一线希望:d T感谢汉克斯对这个难题的洞察。