SQL仅当实体满足某些要求时才允许其参与关系

SQL仅当实体满足某些要求时才允许其参与关系,sql,oracle,database-design,Sql,Oracle,Database Design,我有一个实践超级英雄SQL数据库,有一个超级人物表和一个灾难表。超人和灾难之间有两种关系:创造和预防。SuperPerson表有一个Disposition列,告诉我们他们是邪恶的还是善良的。我如何才能做到只有优秀的超级人物才能参与预防关系,反之亦然,才能参与创建关系 我考虑过创建两个新的表,SuperHero和SuperVillian,它们引用SuperPerson表,这是最合乎逻辑的事情吗?还是有一些PL/SQL可以用来强制执行此约束 编辑:理想情况是将外键定义为: add constrain

我有一个实践超级英雄SQL数据库,有一个超级人物表和一个灾难表。超人和灾难之间有两种关系:创造和预防。SuperPerson表有一个Disposition列,告诉我们他们是邪恶的还是善良的。我如何才能做到只有优秀的超级人物才能参与预防关系,反之亦然,才能参与创建关系

我考虑过创建两个新的表,SuperHero和SuperVillian,它们引用SuperPerson表,这是最合乎逻辑的事情吗?还是有一些PL/SQL可以用来强制执行此约束


编辑:

理想情况是将外键定义为:

add constraint fk_disaster_create
    foreign key (create, 'good') references superperson (superpersonid, disposition);
遗憾的是,此类引用不允许使用常量。一种方法是使用两个值定义固定列:

alter table disaster add disposition_good varchar2(255) default 'good';
alter table disaster add disposition_evil varchar2(255) default 'evil';

alter table disaster add constraint fk_disaster_create
    foreign key (create, 'good') references superperson (superpersonid, disposition);

我能用触发器检查被输入的超级人物的性格是好还是坏,如果不是,我会抛出一个错误吗?@JackCassidy。当然,您可以改为使用触发器。是否可以检查触发器引用的表以外的表中的属性值?例如,当一行被插入到HeroDisaster表中时,我是否可以请求SuperPerson表中具有相应SuperID的Disposition值?如果只有某些成员可以参与关系,这很好地表明您的数据模型正在合并两种不同类型的实体。强制约束所需的PL/SQL通常比简单地拥有两个表更复杂。@JeffreyKemp这是真的,但在本文中,我将SuperPerson分为SuperHero和SuperVillian,这两个表几乎没有区别。这是对表的浪费吗?您可以在创建
Prevent
关系的同时查询良好的
SuperPerson
,反之亦然
Create
。为什么要在实体级别设置约束?不存在“浪费”表的情况-您的设计不应超过或少于正确设计所需的表数。如果您需要超级英雄、超级恶棍和超级人物的表格,请创建它们。