在每个 table 中存储主主键的外键

Storing a foreign key for the main primary key in each table

假设我们有 table UsersID 作为主键,并且用户有以下相关实体:

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

现在,根据上述 tables,出于安全原因,必须将 userId 作为参数传递,以获取 Subject 的所有 SubjectPapers与用户相关,而不仅仅是传递 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 外键是否会通过在两列(UserId 和 SubjectId)上添加非聚集索引来提高查询性能?有没有副作用?还是有其他方法可以避免将父用户包含在每个相关实体中?任何建议表示赞赏。

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

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

IE 喜欢

public class User
{
    public int UserId { get; set; }
    public virtual ICollection<Subject> Subjects { set; } = new HashSet<Subject>();
}
public class Subject
{
    public int UserID { get; set; }
    public int SubjectId { get; set; }
    public virtual User UserId { get; set; }
}

并配置如下:

modelBuilder.Entity<Subject>().HasKey(s => new { s.UserID, s.SubjectId });
modelBuilder.Entity<Subject>().Property(s => s.SubjectId).ValueGeneratedOnAdd();

这优化了 UserID 检索并防止主题 table 需要多个索引。它在 (UserID,SubjectID) 上有一个聚集索引,而不是在两列上需要两个单独的索引。