说我有一个包含以下字段的表:
一个联赛将举办许多比赛。 通常每个联赛将使用其自己的本地数据库,因此该本地数据库的所有记录中的LeagueID字段都将相同。 联盟每年一次将其数据上载到国家主管部门,然后有必要使用LeagueID来区分具有相同MatchID的比赛。
实现复合主键的最佳方法是什么(使用EF Fluent API)?
Entity<Match>.HasKey(match=>new {match.LeagueID,match.MatchID})
要么
Entity<Match>.HasKey(match=>new {match.MatchID,match.LeagueID})
在人眼中,联赛-比赛的顺序是合乎逻辑的,因为它将把特定联赛的比赛组合在一起。 但是我了解到,在编写复合键时,出于性能方面的考虑,首先使用区分最大的字段非常重要。
我想你也可以吃蛋糕。
数据库
通常 ,在数据库中实现密钥时,具有更多选择性字段的较窄密钥将产生更好的性能。 单键和复合键都适用。 我一般地说,因为与您的查询模式不完全匹配的更具选择性的索引可能毫无用处。 例如,在您的组合键中,如果MatchID
为第一个(选择性更高),但您通过LeagueID
查询的频率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子句的顺序几乎没有关系。 在线书籍简要地解释了这个问题, 并指出 :
逻辑运算符的评估顺序可以根据查询优化器的选择而变化。 )。
您可以使用HasColumnOrder选择数据库中字段的顺序