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

问题描述 投票:2回答:2

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

  • LeagueID
  • MatchID
  • 一些数据

一个联赛将举办许多比赛。 通常每个联赛将使用其自己的本地数据库,因此该本地数据库的所有记录中的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
2个回答
5
投票

我想你也可以吃蛋糕。

数据库
通常 ,在数据库中实现密钥时,具有更多选择性字段的较窄密钥将产生更好的性能。 单键和复合键都适用。 我一般地说,因为与您的查询模式不完全匹配的更具选择性的索引可能毫无用处。 例如,在您的组合键中,如果MatchID为第一个(选择性更高),但您通过LeagueID查询的频率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子句的顺序几乎没有关系。 在线书籍简要地解释了这个问题, 并指出

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.