SQLITE -处理派生属性

o2g1uqev  于 2022-12-27  发布在  SQLite
关注(0)|答案(1)|浏览(134)

我是一名计算机科学专业的学生,正在尝试开发一个应用程序来存储我亲爱的同事的成绩。为此,我将使用SQLite来存储成绩。在我的数据库中,将有一个名为Student的表(我的每一位同事)、一个表Course(我们上过的课程)和一个表Enrollment(注册),该表存储每个人所选课程的信息。
我还想在Student表中包含两个派生属性average_grade和total_credits,正如您可能已经想到的,我必须从其他两个表中删除这些信息,我面临的问题是:我该怎么做呢?
我曾经考虑过使用视图,但我可能会一直使用它,我认为我的应用程序不会有很好的表现。然后我考虑了物化视图,但我发现SQLite不支持它,现在我考虑使用TRIGGERS,但我认为我可能会使这个问题复杂化。
在SQLite中有什么好的干净的方法来做这件事吗?预先计算这些值,作为缓存,并且只在我改变某些表时才改变它们?

**注:**我只是想冻结一下,我很少向这个数据库中插入数据(只在学期末或考试成绩出来后)。

wribegjk

wribegjk1#

根据您的描述,您有一个如下所示的数据模型:

如果要在enrollment表中插入新行时更新student表中的average_gradetotal_credits,可以创建一个触发器来执行此操作:

create trigger if not exists tr_enrollment after insert on enrollment
for each row
begin
    update student
       set average_grade = c.average_grade,
           total_credits = c.total_credits
      from (select e.student_id          as student_id,
                   avg(e.grade)          as average_grade,
                   sum(c.course_credits) as total_credits
              from enrollment e
              join course c
                on e.course_id = c.course_id
             where e.student_id = NEW.student_id 
             group by e.student_id) as c
     where student.student_id = c.student_id; 
end;

但是,您可能需要考虑UPDATEDELETE操作是否会发生在enrollment表上,然后相应地创建类似的触发器。

相关问题