复合键字段的最佳顺序是什么?

Dab*_*rnl 2 database-design entity-framework composite-key entity-framework-5

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

  • LeagueID
  • MatchID
  • 一些数据

联盟将举办许多比赛.通常每个联盟都将使用自己的本地数据库,因此LeagueID字段在此本地数据库的所有记录中都是相同的.联盟每年一次将其数据上传到国家当局,然后联盟ID将有必要对具有相同MatchID的比赛进行识别.

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

Entity<Match>.HasKey(match=>new {match.LeagueID,match.MatchID})
Run Code Online (Sandbox Code Playgroud)

要么

Entity<Match>.HasKey(match=>new {match.MatchID,match.LeagueID})
Run Code Online (Sandbox Code Playgroud)

对于人眼来说,联盟 - 比赛的顺序是合乎逻辑的,因为它将把特定联盟的比赛保持在一起.但我明白,在编写复合键时,出于性能原因首先使用最具辨别力的字段非常重要.

EBa*_*arr 5

我想你可以吃蛋糕也可以吃.

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

我认为,真正的问题不是索引A或B更具选择性,而是"您对查询方式有适当的索引吗?" (并强制执行数据完整性,但这是一个不同的讨论).所以你需要弄清楚如何查询这个表.如果您查询:

  • LeagueID 大部分时间 - 指数 LeagueID, MatchID
  • MatchID 大部分时间 - 指数 MatchID, LeagueID
  • 复合LeagueIDMatchID大部分时间 - 指数 MatchID, LeagueID
  • 混合包 - 您可能希望每个订单有两个索引,但您必须弄清楚维护两个索引的额外开销是否值得插入/更新/删除.

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

假设您正在使用SQL Server,那么您编写where子句的顺序非常重要.在线书籍简洁地解释了这个问题,并说明:

逻辑运算符的评估顺序可以根据查询优化器的选择而变化.).