这就是你要做的。首先,发行商和电影之间是一对多的关系——一个发行商可以发行多部电影,但每部电影只有一个发行商。但是,类型到电影是多对多关系(您声明一部电影有多种类型,但也有一种类型有多种电影的情况),因此您应该为这种关系有一个额外的表。
本质上:
publisher:
publisher_id
publisher_name
<other publisher info>
type:
type_id
type_name
<other type info>
movie:
movie_id
movie_name
publisher_id references publisher(publisher_id)
<other movie info>
movie_type:
movie_id references movie(movie_id)
type_id references type(type_id)
为所有这些提供合适的主键。
然后假设您已插入发行商和类型,您可以这样插入电影:
begin transaction;
insert into movie (movie_name,publisher_id) values (
'Avatar',
(select publisher_id from publisher where publisher_name = 'Spielberg')
);
insert into movie_type (movie_id,type_id) values (
(select movie_id from movie where movie_name = 'Avatar'),
(select type_id from type where type_name = 'SciFi')
);
insert into movie_type (movie_id,type_id) values (
(select movie_id from movie where movie_name = 'Avatar'),
(select type_id from type where type_name = 'GrownUpSmurfs')
);
commit;
换句话说,您可以使用子选择基于以下内容从相关表中获取 ID:unique属性集(上面的示例假设电影名称是唯一的,实际上您将需要更具体的查询,例如处理具有相同名称的不同电影:例如《欧米茄人》)。
如果您没有使用支持在值部分中进行选择的 DBMS,那么您最好的选择可能就是记住或将相关值提取到您使用的任何编程语言中的变量中,并构造一个查询来执行此操作。在伪代码中:
begin transaction;
insert into movie (movie_name,publisher_id) values (
'Avatar',
(select publisher_id from publisher where publisher_name = 'Spielberg')
);
select movie_id into :m_id from movie where movie_name = 'Avatar';
select type_id into :t_id1 from type where type_name = 'SciFi';
select type_id into :t_id2 from type where type_name = 'GrownUpSmurfs';
insert into movie_type (movie_id,type_id) values (:m_id, :t_id1);
insert into movie_type (movie_id,type_id) values (:m_id, :t_id2);
commit;
回复您的评论:
嘿,我不明白类型和电影关系的要点..请您详细说明这一点..问候阿比德
《阿凡达》和《Solaris》都可以被认为是科幻类型。一种类型有这么多电影。 《X战警:金刚狼》既可以视为动作片,也可以视为漫画翻拍版。一部电影有多种类型。
多对多关系最好用包含两个相关表之间的交叉匹配的单独表来表示。