Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.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
Asp.net 包含永远不会删除或更改的数据的表_Asp.net_Sql_Sql Server_Database_Database Design - Fatal编程技术网

Asp.net 包含永远不会删除或更改的数据的表

Asp.net 包含永远不会删除或更改的数据的表,asp.net,sql,sql-server,database,database-design,Asp.net,Sql,Sql Server,Database,Database Design,这是对我昨天提出的关于存储历史数据()的问题的更深入的跟进,我正试图缩小我的问题范围 如果您有一个在应用程序级别表示数据对象的表,并且出于历史目的需要该表,则将其设置为无法删除信息的位置被视为不好的做法。基本上,我有一个代表工人安全要求的表格,我想这样做,这些要求永远不能被删除或更改。因此,如果需要进行更改,将创建一个新记录 这不是个好主意吗?处理此类数据的最佳实践是什么?我有一个包含历史安全培训数据的表,它指向包含需求数据的表(以及其他一些关键表),因此我不能让需求被更改,否则历史表将指向错误

这是对我昨天提出的关于存储历史数据()的问题的更深入的跟进,我正试图缩小我的问题范围

如果您有一个在应用程序级别表示数据对象的表,并且出于历史目的需要该表,则将其设置为无法删除信息的位置被视为不好的做法。基本上,我有一个代表工人安全要求的表格,我想这样做,这些要求永远不能被删除或更改。因此,如果需要进行更改,将创建一个新记录

这不是个好主意吗?处理此类数据的最佳实践是什么?我有一个包含历史安全培训数据的表,它指向包含需求数据的表(以及其他一些关键表),因此我不能让需求被更改,否则历史表将指向错误的信息

这不是个好主意吗

你的设想对我来说完全正确。如果您有需要保存的历史数据,有多种方法可以满足该要求

选项1

将所有历史数据和当前数据存储在一个表中(确保存储了创建日期,以便了解旧数据和新数据)。当您需要检索某人的最新记录时,只需基于表中存在的最新日期即可

选项2


将所有历史数据存储在单独的表中,并将当前数据保存在另一个表中。如果您正在处理数百万条记录,这样就不会降低在此基础上构建的任何应用程序的性能,这可能是有益的。无论是在创建新记录时,还是通过夜间作业,您都可以将旧数据移动到另一个表中,以保持当前表的轻量级。

这里有一个替代方案,它不一定“更好”,但需要记住

您可以有单独的“活动”表和“历史”表,然后创建一个触发器,这样每当修改或删除活动表中的一行时,旧的行值连同时间戳一起复制到历史表中

这样,应用程序可以自然地处理活动表,同时在历史表中自动生成准确的更改历史。由于这在DBMS级别工作,您将更能抵抗应用程序错误


当然,如果需要维护整个对象图(即通过外键链接的多个表)的历史记录,事情可能会变得更加混乱。可能最简单的选择是放弃历史表的引用完整性,而只保留活动表的引用完整性


如果这还不足以满足项目的需要,那么您必须以某种方式表示整个图形在更改时的“快照”。一种方法是将连接也视为版本化对象。或者,您可以只复制端点对象的每个版本的所有连接。任何一种情况都会使您的逻辑大大复杂化。

我认为选项2接近我所需要的,但我很难理解外键和约束需要做什么。为了进一步澄清这个问题,我有一个员工表,一个需求表,一个行动表。操作分配给需求,需求分配给员工,员工完成操作。所以我需要一个额外的表来容纳所有3个人,这就是你所说的吗?我想这取决于你想做什么。仅出于历史目的复制其他表(employee和action)似乎是多余的(除非您也有这些表的历史详细信息,但听起来好像没有)。我只需要保留需求的历史记录,并放弃对历史数据执行外键。即使没有适当的外键强制,也可以始终将其连接到其他表(如果出于某种原因需要关联数据)。