为了解决有缺陷的设计,看到我原来的评论似乎不被 OP 理解,这里有一个演示,正是我在说什么。数据设计的一个基本规则是您不计算和存储可以在运行时计算的值。在这个特定的应用程序中,这意味着您不会尝试不断更新和存储多个电影评分的平均值。而是在需要时进行计算。
SQL> show user
USER is "SCOTT"
SQL> -- -------- create the tables
SQL> create table movies
2 ( movie_id number not null enable,
3 movie_title varchar2(30) not null enable,
4 constraint movies_pk primary key (movie_id)
5 )
6 ;
Table created.
SQL> --
SQL> create table ratings
2 ( rating_id number not null enable,
3 movie_id number not null enable,
4 rating_source varchar2(30) not null enable,
5 movie_rating number not null enable,
6 constraint ratings_pk primary key (rating_id, movie_id),
7 constraint ratings_chk1 check (movie_rating in (1,2,3,4,5)) enable,
8 constraint ratings_fk1 foreign key (movie_id)
9 references scott.movies (movie_id) on delete cascade enable
10 )
11 ;
Table created.
SQL> -- -------- load tables
SQL> insert into movies values (1,'To Kill A Mockingbird');
1 row created.
SQL> insert into ratings values (1,1,'Rotten Tomatoes',2);
1 row created.
SQL> insert into ratings values (2,1,'ImDB',2);
1 row created.
SQL> insert into ratings values (3,1,'Amazon User',3);
1 row created.
SQL> --
SQL> insert into movies values (2,'Saving Private Ryan');
1 row created.
SQL> insert into ratings values (4,2,'Rotten Tomatoes',4);
1 row created.
SQL> insert into ratings values (5,2,'ImDB',5);
1 row created.
SQL> insert into ratings values (6,2,'Amazon User',5);
1 row created.
SQL>
SQL> -- -------- Do the query
SQL> select * from movies;
MOVIE_ID MOVIE_TITLE
---------- ------------------------------
1 To Kill A Mockingbird
2 Saving Private Ryan
2 rows selected.
SQL> select * from ratings;
RATING_ID MOVIE_ID RATING_SOURCE MOVIE_RATING
---------- ---------- ------------------------------ ------------
1 1 Rotten Tomatoes 2
2 1 ImDB 2
3 1 Amazon User 3
4 2 Rotten Tomatoes 4
5 2 ImDB 5
6 2 Amazon User 5
6 rows selected.
SQL> select m.movie_title,
2 avg(r.movie_rating)
3 from movies m
4 join ratings r on m.movie_id = r.movie_id
5 group by m.movie_title
6 order by m.movie_title
7 ;
MOVIE_TITLE AVG(R.MOVIE_RATING)
------------------------------ -------------------
Saving Private Ryan 4.66666667
To Kill A Mockingbird 2.33333333
2 rows selected.
SQL> -- -------- clean up
SQL> drop table ratings purge;
Table dropped.
SQL> drop table movies purge;
Table dropped.
也就是说,原始问题(如何编写触发器)具有家庭作业问题的所有特征。现在,如果任务是非常具体地编写这样一个触发器,人们会希望其目的是教授一些编码技术。这不是我们第一次看到基于非常有缺陷的设计的特定家庭作业,并且问题所暗示的设计非常有缺陷。当我看到这样的时候,我严重质疑讲师的资格,做出一个与基本数据设计原则背道而驰的任务。他们应该已经涵盖(实际上,在专门针对此类的课程中,以及此类作业的先决条件)数据设计的基础知识,包括但不限于数据规范化、第一范式、第二范式和第三范式表格(查找它们)。