Database 数据库中的冗余与代码中的效率

Database 数据库中的冗余与代码中的效率,database,entity-framework,database-design,Database,Entity Framework,Database Design,我想用一个例子来解释我的问题。假设有很多课程学生可以注册。每门课程都可以有许多讨论墙。每个讨论墙都包含问题。每个问题都可以有答案。可以为回复(或评论)分配徽章 在我的例子中,我需要知道哪个回复属于哪个课程(列出回复时),对于徽章也是如此。我可以用EntityFramework实现这一点,但查询变得非常复杂,并导致性能问题 在这种情况下,在回复(或BadgeAssignments)表中设置CourseId列是否更好?还是不?这将使我的生活在某些方面更加轻松,但从长远来看并不确定。你怎么认为?有时候

我想用一个例子来解释我的问题。假设有很多课程学生可以注册。每门课程都可以有许多讨论墙。每个讨论墙都包含问题。每个问题都可以有答案。可以为回复(或评论)分配徽章

在我的例子中,我需要知道哪个回复属于哪个课程(列出回复时),对于徽章也是如此。我可以用EntityFramework实现这一点,但查询变得非常复杂,并导致性能问题


在这种情况下,在回复(或BadgeAssignments)表中设置CourseId列是否更好?还是不?这将使我的生活在某些方面更加轻松,但从长远来看并不确定。你怎么认为?有时候有一些冗余会更好吗?我不认为以后需要更新CourseId字段。

我将在这里发布一个示例:

public class SchoolEntities : DbContext 
{ 
    public DbSet<Department> Departments { get; set; } 
} 

public class Department 
{ 
    // Primary key 
    public int DepartmentID { get; set; } 
    public string Name { get; set; } 

    // Navigation property 
    public virtual ICollection<Course> Courses { get; set; } 
} 

public class Course 
{ 
    // Primary key 
    public int CourseID { get; set; } 

    public string Title { get; set; } 
    public int Credits { get; set; } 

    // Foreign key 
    public int DepartmentID { get; set; } 

    // Navigation properties 
    public virtual Department Department { get; set; } 
} 

public partial class OnlineCourse : Course 
{ 
    public string URL { get; set; } 
} 

public partial class OnsiteCourse : Course 
{ 
    public string Location { get; set; } 
    public string Days { get; set; } 
    public System.DateTime Time { get; set; } 
}
公共类学校实体:DbContext
{ 
公共数据库集部门{get;set;}
} 
公共课系
{ 
//主键
public int DepartmentID{get;set;}
公共字符串名称{get;set;}
//导航属性
公共虚拟ICollection课程{get;set;}
} 
公共课
{ 
//主键
public int CourseID{get;set;}
公共字符串标题{get;set;}
公共整数积分{get;set;}
//外键
public int DepartmentID{get;set;}
//导航属性
公共虚拟部门部门{get;set;}
} 
公共部分在线课程:课程
{ 
公共字符串URL{get;set;}
} 
现场公共部分课程:课程
{ 
公共字符串位置{get;set;}
公共字符串天{get;set;}
public System.DateTime{get;set;}
}

这是一个小例子。。。你有这些信息吗?

我将在这里发布一个示例:

public class SchoolEntities : DbContext 
{ 
    public DbSet<Department> Departments { get; set; } 
} 

public class Department 
{ 
    // Primary key 
    public int DepartmentID { get; set; } 
    public string Name { get; set; } 

    // Navigation property 
    public virtual ICollection<Course> Courses { get; set; } 
} 

public class Course 
{ 
    // Primary key 
    public int CourseID { get; set; } 

    public string Title { get; set; } 
    public int Credits { get; set; } 

    // Foreign key 
    public int DepartmentID { get; set; } 

    // Navigation properties 
    public virtual Department Department { get; set; } 
} 

public partial class OnlineCourse : Course 
{ 
    public string URL { get; set; } 
} 

public partial class OnsiteCourse : Course 
{ 
    public string Location { get; set; } 
    public string Days { get; set; } 
    public System.DateTime Time { get; set; } 
}
公共类学校实体:DbContext
{ 
公共数据库集部门{get;set;}
} 
公共课系
{ 
//主键
public int DepartmentID{get;set;}
公共字符串名称{get;set;}
//导航属性
公共虚拟ICollection课程{get;set;}
} 
公共课
{ 
//主键
public int CourseID{get;set;}
公共字符串标题{get;set;}
公共整数积分{get;set;}
//外键
public int DepartmentID{get;set;}
//导航属性
公共虚拟部门部门{get;set;}
} 
公共部分在线课程:课程
{ 
公共字符串URL{get;set;}
} 
现场公共部分课程:课程
{ 
公共字符串位置{get;set;}
公共字符串天{get;set;}
public System.DateTime{get;set;}
}

这是一个小例子。。。你有这些信息吗?

我最讨厌的是牺牲数据完整性来换取性能。更快地获得不太可靠的答案不是一个好的解决方案。但是,在不牺牲数据完整性的情况下提高性能的更改是可以接受的

冗余很可能会牺牲数据完整性。这当然是异常数据可以开始的关键点。问题是两个“数据集”必须严格同步,这取决于设计,可能容易,也可能困难。无论采用哪种方式,都需要系统资源来维持同步,因此您需要添加另一个性能上的影响

幸运的是,该性能影响将添加到DML操作中,因为这是执行同步的地方。通常,将性能时间从查询转移到DML(通常对响应时间不太敏感)是一个好的解决方案

然而,魔鬼在于细节,而你没有提供细节。在没有冗余的情况下能否充分提高性能?在冗余数据之间保持同步的难度有多大?问最后一个问题的另一种方式是:异常(不同步)数据潜入系统的可能性有多大?不同步的数据会有多大的问题?修复它会有多困难


没有提供足够的信息来回答这些问题。但在研究解决方案时,请牢记这些原则。

我最恼火的是牺牲数据完整性来换取性能。更快地获得不太可靠的答案不是一个好的解决方案。但是,在不牺牲数据完整性的情况下提高性能的更改是可以接受的

冗余很可能会牺牲数据完整性。这当然是异常数据可以开始的关键点。问题是两个“数据集”必须严格同步,这取决于设计,可能容易,也可能困难。无论采用哪种方式,都需要系统资源来维持同步,因此您需要添加另一个性能上的影响

幸运的是,该性能影响将添加到DML操作中,因为这是执行同步的地方。通常,将性能时间从查询转移到DML(通常对响应时间不太敏感)是一个好的解决方案

然而,魔鬼在于细节,而你没有提供细节。在没有冗余的情况下能否充分提高性能?在冗余数据之间保持同步的难度有多大?问最后一个问题的另一种方式是:异常(不同步)数据潜入系统的可能性有多大?不同步的数据会有多大的问题?修复它会有多困难


没有提供足够的信息来回答这些问题。但是,在研究解决方案时,请记住它们。

系统的每个组件都应加以利用,因为它的设计目的是使其成为“最佳”。当它们按照设计工作时,工作会更好。严格来说,这就是我对你问题的回答

关系数据库<