将历史数据更改存储在 SQL 中以用于报告

Storing historical changes to data in SQL for reporting

我管理一个预订应用程序,我已经通过了 PR 以启用报告,我被要求提供的报告之一是一份显示给定日期范围内资源使用情况的报告。

我正在尝试找出存储资源历史更改的最佳方法,以便我可以准确报告利用率百分比。

例如

1 月 1 日至 1 月 12 日,可能有 10 个资源,如果每天都预订了所有 10 个资源,那么我会显示 100% 未使用,但是,如果有人在未来的任何时候再添加 10 个资源,我的数字会如果在添加这些资源后报告在上述日期范围内再次 运行,则不正确。

我想我可以将一个计数存储在另一个 table 中,如果有 add/delete 资源,它只是附加到,这是最好的解决方案吗?当我稍后查询数据时,从报告的角度来看感觉非常混乱,因为我可能在一天中有多行添加,例如我需要处理。

我想接触这里的思想,看看我是否可以从不同的角度探索事物,让我找到更好的解决方案。

我的应用程序是一个 dotnet 5 web 应用程序,运行在 Azure 中,该应用程序与 Azure 函数对话 API,后者又使用 Azure SQL 进行持久化。

非常感谢您发送给我的任何建议!

Temporal tables 允许您跟踪和分析数据更改的完整历史记录,而无需自定义编码。保存任何历史数据将使用额外的数据库存储空间和其他 CPU 资源,因为每个 CRUD 操作都将在时间 table.

中保存为单独的实体

根据您是开始新开发还是升级现有应用程序,您将创建临时 tables 或通过添加临时属性修改现有的。在 SQL Server Management Studio (SSMS) 或作为 Transact-SQL 语句执行这些操作。

  1. 在 SSMS 中,使用 Tables -> New -> System-Versioned Table... 路径创建时间 tables 现有 tables.

  1. 使用 T-SQL 创建时间 table。

注:每个时间table的强制性元素是PERIOD定义和SYSTEM_VERSIONING子句引用另一个用户table 将存储历史行版本:

CREATE TABLE WebsiteUserInfo
(  
    [UserID] int NOT NULL PRIMARY KEY CLUSTERED
  , [UserName] nvarchar(100) NOT NULL
  , [PagesVisited] int NOT NULL
  , [ValidFrom] datetime2 (0) GENERATED ALWAYS AS ROW START
  , [ValidTo] datetime2 (0) GENERATED ALWAYS AS ROW END
  , PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo)
 )  
 WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.WebsiteUserInfoHistory));

您还可以将现有的 table 扩展为临时的,如下例所示:

ALTER TABLE WebsiteUserInfo
ADD
    ValidFrom datetime2 (0) GENERATED ALWAYS AS ROW START HIDDEN  
        constraint DF_ValidFrom DEFAULT DATEADD(SECOND, -1, SYSUTCDATETIME())
    , ValidTo datetime2 (0)  GENERATED ALWAYS AS ROW END HIDDEN
        constraint DF_ValidTo DEFAULT '9999.12.31 23:59:59.99'
    , PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo);

ALTER TABLE WebsiteUserInfo  
SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.WebsiteUserInfoHistory));
GO

CREATE CLUSTERED COLUMNSTORE INDEX IX_WebsiteUserInfoHistory
ON dbo.WebsiteUserInfoHistory
WITH (DROP_EXISTING = ON);

来源:https://docs.microsoft.com/en-us/azure/azure-sql/temporal-tables