【问题标题】:c# Entity Framework using rowbegindate in transaction tablec#实体框架在事务表中使用rowbegindate
【发布时间】:2016-10-11 12:55:09
【问题描述】:

我是一名开始与数据库架构师合作的开发人员。他正在使用我以前从未见过的设计,我认为这会对性能产生负面影响。

在事务表中,他在每个表中使用两个字段.. rowbegindate 和 rowenddate。有一个父表,其中只有几个永远不会改变的字段。这称为 PersonH​​eader 表。该键用于子 Person 表的 fk。 Person 表的 PK 是 PersonH​​eader 表的 fk 和该行的 RowBeginDate。要检索当前行,我需要始终检查 RowEndDate 是否为 NULL。

我还没有详细了解这将如何影响 Entity Framework 的性能,但我怀疑它不会有效。

我参与过许多项目,但从未见过这种方法。在事务表中有这么多死记录对性能有什么影响。我不认为会有很多更新,但我估计数据库 person 表最终可能有 500,000 行或更多,更不用说详细表了。

【问题讨论】:

  • 放一张表架构图可能会有所帮助
  • 这是一个缩写:

标签: c# sql-server entity-framework database-design


【解决方案1】:

使用具有审计要求的应用程序时,必须维护记录的历史版本并不少见。我使用 EmployeeID 和 UpdatedOn 字段作为键(例如,在存储员工记录的更改历史时)做了类似的事情,因此我可以获得最新版本的记录。

只要表被正确索引并且索引不会因为复合键而变得太大,我就不会担心性能或记录数。我处理过包含 50 亿条记录的表,性能仍然很好(不过重建索引需要一段时间)。

您甚至可以从实体框架创建一个拦截器,允许您在执行查询时过滤掉“死”记录(请参阅Entity Framework soft delete implementation using database interceptor not working

【讨论】:

    【解决方案2】:

    人头 个人密钥(PK)

    人 人键(PK、FK) 行开始日期(PK) 行结束日期 (其他栏目)

    (我添加了这个作为答案,因为评论不会换行......) 人物位置 LocationTypeKey (PK, FK) 人键(PK、FK) 位置键 (FK) RowBeginDate(不是键) 行结束日期

    位置 位置密钥 (PK) 状态密钥 (FK) RowBeginDate(不是键) 行结束日期

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多