我正在使用Oracle Database 12c企业版。
我有三张桌子:
table producer (
pid int primary key,
name varchar2(50)
);
table movie (
mid int primary key,
pid varchar2(50),
name varchar2(50)
);
table moviecoproducers (
mid int,
pid int
);
电影表格中的pid(例如moviecoproducers表中的pid和mid)由适当的外键引用。此外,moviecoproducers表中mid和pid值的组合是唯一的。
我现在必须确保没有生产者被引用为电影表中的(主)生产者,并且作为同一电影的moviecoproducer中间表中的共同生产者。我创建了一个触发器,但是现在我问自己,如果我重新设计我的表结构,是否会有更多的eazy解决方案(例如检查约束)。
我只需要一个触发因为设计不好,因为我不知道如何以不同/更好的方式做到这一点。
答案 0 :(得分:1)
创建一个典型的3表多对多结构。
table producer (
pid int primary key,
name varchar2(50)
);
table movie (
mid int primary key,
name varchar2(50)
);
table movieproducer (
mid int,
pid int,
status varchar2(10)
)
status
将保留&#34; 主要&#34;或&#34; co </ em>&#34;值。
现在,您可以使用表约束和无触发器来管理限制。
额外的好处:如果在将来的某个时间你想要介绍类似&#34; 初级合作制片人&#34;你不需要改变你的架构。
此设计未完全规范化:缺少状态表。看看你是否有兴趣加入它。
答案 1 :(得分:0)
好的,不确定varchar pid代表什么..所以让我们从一个稍微不那么令人困惑的表结构开始......
table producer ( producer_id int primary key,
producer_name varchar2(50) )
table movie ( movie_id int primary key,
movie_data varchar2(50)
movie_name varchar2(50) )
table movieproducers ( movie_id int*#
producer_type int*
producer_id int# )
这里我们在MovieProducers中有2个共享密钥(或唯一索引)。首先是movie_id和producer_type,其中1将是主要生产者,1以上的任何其他数字将是防止重复生成者类型的共同生产者 - 而movie_id和producer_id将消除生产者对特定电影多次出现)< / p>
我相信这样可以解决您所遇到的问题而不需要触发器