在 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 制作副本,以便您可以维护一致的外键 - 例如DocumentHistory
、ConLineHistory
、LegHistory
。这是很多重复的代码。然后你必须考虑,当模式改变时所有的历史记录会发生什么?
就我个人而言,我会将此信息作为 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 中有一些使用它的例子查询字符串。
我的数据库中有一个实体与多个实体链接,我需要存储基本实体以及 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 制作副本,以便您可以维护一致的外键 - 例如DocumentHistory
、ConLineHistory
、LegHistory
。这是很多重复的代码。然后你必须考虑,当模式改变时所有的历史记录会发生什么?
就我个人而言,我会将此信息作为 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 中有一些使用它的例子查询字符串。