使用Typescript/javascript在内存数据库中使用性能问题

9 c# entity-framework asp.net-web-api angularjs

我有一个在c#中开发的服务器端,实体框架作为SQL服务器的提供者.我的服务器正在管理学生和班级之间的多对多关系.

  public class Student
  {

      public List<Course> Courses
      .
      .
  }

   public class Course
   {
         public List<Student> Students
        .
        .
   }
Run Code Online (Sandbox Code Playgroud)

我的客户端是使用Typscript在角度js中开发的.要与服务器同步,服务器中的每个更改都会通过推送通知(signalr)推送到客户端.

为了缩短响应时间,我的客户端在内存中保留了一种数据库(因为数据量不是很大,少于500条记录).我保留了一系列学生,他们每个人都会保留一系列课程:

     Students: { [studentId: number] : Courses } ={}
Run Code Online (Sandbox Code Playgroud)

在这个目标中,我跟踪客户端的所有学生和他们的课程.

在我的应用程序中,我可以选择从整个系统中删除多个课程.然而,当做这样的事情时,当在服务器端成功完成动作时,当有许多学生时,客户端的处理变得很重.这是因为我需要遍历所有已删除的课程,并且每个课程都会遍历整个学生数组,以便从学生数组中找到并删除这些课程.(或者首先迭代删除的课程,然后在学生中迭代) - 两者都很重,需要一段时间.

有没有更好的设计呢?我应该以不同的方式处理这个问题吗?

Com*_*Guy 1

我想到了一些事情:

  1. 检查您是否确实需要“客户端数据库”。你的后台有那么慢吗?这不是一个过早的优化吗?我认为如果你删除这部分,你的客户端程序的复杂性将会急剧下降......当你需要的时候直接从服务器获取最新的数据即可。

  2. 如果发生重大变化,请重新加载整个“客户端数据库”。

  3. 优化您的“客户数据库”。删除几百个项目应该不会花太长时间...您在使用吗angular.forEach?它可能会显着减慢你的速度。您是否有几百名学生,但只删除了几门课程?迭代学生,然后(在迭代内)迭代已删除的课程。伪代码:

    for (student in students) {
        for (deletedCourse in deletedCourses) {
             student.removeCourse(deletedCourse);
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

    而不是这样的:

    for (deletedCourse in deletedCourses) {
        for (student in students) {
             student.removeCourse(deletedCourse);
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

    这样,您会进行更多迭代并浪费时间。但如果没有源代码,很难知道。

一般来说,您应该分析代码并确定性能问题。将不同方法所需的时间记录到控制台并进行相应选择。