在 ASP.Net Core 中使用 History table 存储历史数据

Storing Historical Data using History table in ASP.Net Core

我的数据库中有一个实体与多个实体链接,我需要存储基本实体以及 children 实体中更改(插入、更新和删除)的历史数据。

现在我们考虑采用的方式是将每条数据保存在对应的历史实体中。基础 table 看起来像这样:

public partial class Con 
{
    public Guid Id { get; set; }
    public string Note { get; set; }
    ...
    public virtual ICollection<Document> Document { get; set; }
    public virtual ICollection<ConLine> ConLine { get; set; }
    public virtual ICollection<Leg> Leg { get; set; }
}

历史 table 看起来像这样,我不确定如何设计历史 table 来保存链接的 tables 数据:

public partial class ConHistory 
{
    public Guid Id { get; set; }
    public Guid ConId { get; set; }
    public int TransactionId { get; set; }
    ...
    public virtual ICollection<Document> Document { get; set; }
    public virtual ICollection<ConLine> ConLine { get; set; }
    public virtual ICollection<Leg> Leg { get; set; }
}

我该如何解决这个问题?最佳行业做法是什么?我主要关心的是当 child 的数据被更改时,我如何登录 parent 历史记录 table 和相应的 child 历史记录 table。

对于简单的时间序列数据,将可修改字段的副本单独保存 table 是一种完全有效的方法。不幸的是,在您的情况下,您还需要为每个链接的 table 制作副本,以便您可以维护一致的外键 - 例如DocumentHistoryConLineHistoryLegHistory。这是很多重复的代码。然后你必须考虑,当模式改变时所有的历史记录会发生什么?

就我个人而言,我会将此信息作为 json 存储在文本列中。您搜索的所有字段都应该在 sql 中,以便您可以对其进行索引,但其余部分可以序列化为 json 字符串:

public partial class ConHistory 
{
    public Guid Id { get; set; }
    public Guid ConId { get; set; }
    public int TransactionId { get; set; }
    public Guid ModifiedByUser { get; set; }
    public DateTime Date { get; set; }

    // Serialize the rest of the `ConHistory` fields to a json object, and store them here
    public string Json { get; set; }
}

Sql 也有 JSON_VALUE 函数,如果你确实需要从 json 中获取值,Entity Framework 中有一些使用它的例子查询字符串。