【问题标题】:EF6 Table splitting vs shared primary key for multiple splitsEF6 表拆分与多个拆分的共享主键
【发布时间】:2014-01-24 19:44:41
【问题描述】:

我正在将旧数据库系统升级到 .NET + Entity Framework 6(代码优先 POCO)+ PostgreSQL。为了便于编程,我希望将一个大表(200多个字段)拆分为多个实体,例如:

Franchise
FranchiseLegalEntity
FranchiseBilling
FranchiseSignup
FranchiseAllocation
FranchiseCompliance
FranchiseMiscellaneous
FranchiseNotifications

我很高兴发现 EF6 支持“表拆分”:将单个表映射到多个实体以拆分字段。

但是尝试实现这一点,并在线阅读了许多页面,确认在多次拆分时这是有问题的。实体框架不仅需要主实体的导航属性,还需要映射到表的所有实体之间的导航属性。对于我上面的场景,这将需要 21 个无意义的导航属性 - 如果我费心将它们设为双向,则需要 42 个。

见:http://social.msdn.microsoft.com/Forums/en-US/0f65caae-8a66-431f-aa02-4b2c68f871e9/ef-41-rc-code-first-split-one-table-into-multiple-entities?forum=adodotnetentityframework

见:How to separate large table into multiple discrete types using EF-Code-First

建议使用具有共享主键的多个表,这对我来说是一种选择。但是,考虑到 EF 臃肿的 SQL 查询生成,以及 PostgreSQL 有时带有复杂查询的随机查询优化器,我担心这个选项(100GB+ 数据库)的性能。

总结一下:

表格拆分

优点:最佳查询性能,在数据库层实现最快

缺点:用废话污染我的模型和 OnModelBuilding() 方法,让其他开发人员感到困惑

跨多个表的共享主键

优点:最简洁的模型和代码,非遗留数据库的推荐解决方案

缺点:实施额外的工作,可能会降低性能

我的问题:

1) EF6 是否通过 2+ 拆分改进了表拆分?

2) 有没有我没有考虑到的因素?

3) 还有其他选择吗?

附:我对使用 [ComplexType] 不感兴趣

【问题讨论】:

  • 也许您应该考虑使用视图并为视图创建实体?优点 - 简单 - 缺点 - 没有参考。还要考虑在创建数据库后管理表拆分带来的困难,并且事情会进一步发生变化。

标签: c# entity-framework domain-driven-design shared-primary-key table-splitting


【解决方案1】:

有很多假设,您可以尝试 BCP-out 必要的字段子集,然后 BCP-in 将它们返回到所需的数据库表。这是一个简单且可重复的过程,因为 BCP-out SQL 语句在您的控制范围内,因此您始终可以只导出部分数据(例如,仅在某个日期之后创建的记录)。但同样,由于数据量太大,它可能不适合您。

【讨论】:

    【解决方案2】:

    我选择的解决方案是表格拆分选项。

    这涉及向我的模型添加大量无意义的导航属性并依赖流畅的 API。我认为这是两个弊端中较小的一个,因为它们会导致最小的开销,并避免潜在的性能问题。

    我已在此线程中更详细地概述了解决方案(包括代码):

    EF6 failing to build model for Table Split/Shared Primary Key + Base class?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-23
      • 2017-10-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多