2

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

  • 联赛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})

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

4

2 回答 2

5

我想你也可以吃蛋糕。

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

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

  • LeagueID大多数时候——索引LeagueID, MatchID
  • MatchID大多数时候——索引MatchID, LeagueID
  • 复合LeagueID&MatchID大部分时间 -- 索引 MatchID, LeagueID
  • 好坏参半——您可能希望每个订单有两个索引,但您必须弄清楚维护两个索引的额外开销是否值得在插入/更新/删除时受到打击。

EF 和查询在大多数情况下,查询
中列的顺序(或在 EF 中构建匹配的方式)不会产生影响。含义 将产生与. where a=@a and b=@bwhere b=@b and a=@a

假设您使用的是 SQL Server,那么您编写 where 子句的顺序就无关紧要了。网上的书简明扼要地解释了这个问题,并指出

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

于 2013-02-01T14:31:57.297 回答
0

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

于 2013-02-01T14:31:41.090 回答