Dab*_*rnl 2 database-design entity-framework composite-key entity-framework-5
假设我有一个包含以下字段的表:
联盟将举办许多比赛.通常每个联盟都将使用自己的本地数据库,因此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)
对于人眼来说,联盟 - 比赛的顺序是合乎逻辑的,因为它将把特定联盟的比赛保持在一起.但我明白,在编写复合键时,出于性能原因首先使用最具辨别力的字段非常重要.
我想你可以吃蛋糕也可以吃.
数据库
在数据库中实现密钥时,通常使用具有更多选择性字段的较窄密钥将产生更好的性能.这适用于单个和复合键.我一般说,因为一个与你的查询模式不匹配的更具选择性的索引可能是没用的.例如,在复合键中,if MatchID是第一个(选择性更强),但是您更频繁LeagueID地查询(选择性较低),选择性将对您不利.
我认为,真正的问题不是索引A或B更具选择性,而是"您对查询方式有适当的索引吗?" (并强制执行数据完整性,但这是一个不同的讨论).所以你需要弄清楚如何查询这个表.如果您查询:
LeagueID 大部分时间 - 指数 LeagueID, MatchID MatchID 大部分时间 - 指数 MatchID, LeagueID LeagueID和MatchID大部分时间 - 指数
MatchID, LeagueIDEF和查询
在大多数情况下,查询中列的顺序(或在EF中构建匹配的方式)不会产生任何影响.意义 where a=@a and b=@b将与查询计划和性能相同where b=@b and a=@a.
假设您正在使用SQL Server,那么您编写where子句的顺序非常重要.在线书籍简洁地解释了这个问题,并说明:
逻辑运算符的评估顺序可以根据查询优化器的选择而变化.).
| 归档时间: |
|
| 查看次数: |
192 次 |
| 最近记录: |