在每个 table 中存储主主键的外键
Storing a foreign key for the main primary key in each table
假设我们有 table Users
和 ID
作为主键,并且用户有以下相关实体:
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) 上有一个聚集索引,而不是在两列上需要两个单独的索引。
假设我们有 table Users
和 ID
作为主键,并且用户有以下相关实体:
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) 上有一个聚集索引,而不是在两列上需要两个单独的索引。