【问题标题】:What is the best order for the fields of a composite key?复合键字段的最佳顺序是什么?
【发布时间】:2013-02-01 14:24:16
【问题描述】:

假设我有一个包含以下字段的表格:

  • 联赛ID
  • 比赛ID
  • 一些数据

联赛将举办多场比赛。通常每个联赛都会使用自己的本地数据库,因此该本地数据库的所有记录中的 LeagueID 字段都是相同的。联盟每年一次将其数据上传到国家当局,然后需要使用 LeagueID 来区分具有相同 MatchID 的比赛。

实现复合主键的最佳方式是什么(使用 EF Fluent API)?

Entity<Match>.HasKey(match=>new {match.LeagueID,match.MatchID})

Entity<Match>.HasKey(match=>new {match.MatchID,match.LeagueID})

在人眼看来,联赛 - 比赛的顺序是合乎逻辑的,因为它将特定联赛的比赛放在一起。但我明白,在编写复合键时,出于性能考虑,首先使用最具辨别力的字段很重要。

【问题讨论】:

    标签: entity-framework database-design entity-framework-5 composite-key


    【解决方案1】:

    我想你也可以吃蛋糕。

    数据库
    在数据库中实现键时通常具有更多选择性字段的更窄键将产生更好的性能。这适用于单键和复合键。我一般说,因为与您的查询模式不匹配的更具选择性的索引可能毫无用处。例如,在您的复合键中,如果 MatchID 是第一个(选择性更强),但您通过 LeagueID 更频繁地查询(选择性较低),则选择性将对您不利。

    我认为,真正的问题不是索引 A 或 B 更具选择性,而是“您是否有适合查询方式的索引?” (并强制执行数据完整性,但这是一个不同的讨论)。因此,您需要弄清楚如何查询此表。如果您通过以下方式查询:

    • LeagueID 大部分时间——索引LeagueID, MatchID
    • MatchID 大部分时间——索引MatchID, LeagueID
    • 复合LeagueID & MatchID 大部分时间——索引 MatchID, LeagueID
    • 好坏参半——您可能需要为每个订单创建两个索引,但您必须弄清楚维护两个索引的额外开销是否值得在插入/更新/删除时进行。

    EF 和查询
    在大多数情况下,查询 中的列顺序(或在 EF 中构建匹配的方式)不会产生影响。意思是where a=@a and b=@b 将产生与where b=@b and a=@a 相同的查询计划和性能。

    假设您使用的是 SQL Server,那么您编写 where 子句的顺序就无关紧要了。网上的书把这个问题解释得很简洁,stating

    逻辑运算符的求值顺序可能因查询优化器的选择而异。 )。

    【讨论】:

    • 谢谢——这通常是我耳朵之间的混乱:-D
    • When a=@a and b=@bWhen b=@b and a=@a 只会在数据库引擎评估所有条件。我想当第一个条件为假时,引擎不会评估第二个条件。就像 VB AndAlso 或 C# &amp;&amp; 运算符一样。
    • @Dabblernl - 短路可以发生,但不能保证。参见讨论:the ansi sql specsql server。无论哪种方式,我们都不知道 OP(编辑:你)正在使用什么数据库,所以我说“大部分情况下”。
    • @EBarr 您发送的有关布尔值短路的链接很有趣,但请确认短路通常发生在简单场景中的概念。这证实了您应该首先使用最有区别的字段。
    • 我不是要轻率,但我还是不同意。布尔评估只是一个例子。规范说,在评估 where 子句时,“表达式是否实际从左到右评估取决于实现”。我认为您混淆了索引中字段的顺序与查询文本中的顺序。 index 中的顺序很重要,而在 query text 中则无关紧要。我更新了这个问题,详细说明了为什么这是真的。
    【解决方案2】:

    您可以使用 HasColumnOrder 选择数据库中字段的顺序

    【讨论】:

    • 好的,那么问题更多是关于数据库实现而不是 EF 本身。 “在人眼看来,联赛的顺序 - 比赛是合乎逻辑的”这一点就无关紧要了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-01
    • 2012-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多