在每个表中为主主键存储外键

问题描述 投票:0回答:1

假设我们有一个以Users作为主键的表ID,并且用户具有以下相关实体:

UserSubjects(SubjectId <PK>,UserId <FK>)
SubjectPapers(PaperId<PK>,SubjectId<FK>)

现在根据上表,出于安全原因,必须将userId作为参数传递,以获取与用户相关的SubjectPapers的所有Subject,而不仅仅是传递SubjectId。] >

以该方法为例:

 public List<SubjectPaper> GetBySubject(int userId, int subjectId)
 {
     return _context.SubjectPapers
         .Include(k => k.UserSubject)
         .Where(k => k.SubjectId == subjectId && k.UserSubject.UserId == userId)
         .ToList();
 }

在上述方法中,必须将用户包括在查询中,以验证他是否正在请求获得其主题之一。

如果SubjectPapers在理论上也具有更多相关实体,该怎么办。通过在两列(UserId和SubjectId)上添加非聚集索引,存储UserId外键是否可以提高查询性能?有副作用吗?还是有其他方法可以避免将父用户包括在每个相关实体中?任何建议表示赞赏。

假设我们有一个表ID为主键的Users,并且该用户具有以下相关实体:UserSubjects(SubjectId ,UserId )SubjectPapers(PaperId ,...

sql sql-server ef-core-2.0
1个回答
0
投票

如果需要UserId来查找主题,则Subject是“ Weak Entity”,并且UserID应该是其复合主键的开头。

UserSubjects(UserId <PK,FK>,SubjectId <PK>)
© www.soinside.com 2019 - 2024. All rights reserved.