Sql 如何设计相互依赖的两个表?也就是说,如果TableB中没有行,TableA的行就不能存在,反之亦然

Sql 如何设计相互依赖的两个表?也就是说,如果TableB中没有行,TableA的行就不能存在,反之亦然,sql,postgresql,Sql,Postgresql,假设从应用程序的角度来看,我们有以下要求: 超类有一些属性,如Type、PropertyA、PropertyB等。 子类、子类B、子类C都继承了这些属性,当然也可以有自己的属性。 请注意,大约有20个子类。为了这个例子,我只列出了三个 要记住的主要一点是,超类的实例必须是一个且只有一个子类。因此,超类实例不能同时是子类a和子类B,并且超类实例不能单独存在。 此外,同一类型属性的实例可以存在于多个子类中。例如,Type=='Type1'可以从subassa和subassc中获取多行 基于此,我通常

假设从应用程序的角度来看,我们有以下要求:

超类有一些属性,如Type、PropertyA、PropertyB等。 子类、子类B、子类C都继承了这些属性,当然也可以有自己的属性。 请注意,大约有20个子类。为了这个例子,我只列出了三个

要记住的主要一点是,超类的实例必须是一个且只有一个子类。因此,超类实例不能同时是子类a和子类B,并且超类实例不能单独存在。 此外,同一类型属性的实例可以存在于多个子类中。例如,Type=='Type1'可以从subassa和subassc中获取多行

基于此,我通常甚至不会创建超类表。取而代之的是不同的子类表,如下所示: 我只是在每个表中重复继承的属性。问题解决了

然而,我考虑创建一个超类表的唯一原因是因为我想运行一个查询,它允许我获取特定类型的所有实例。像这样:

从类型为'Type1'的超类中选择PropertyA

这可能会从多个子类中获取行。这将避免我查看所有子类表的痛苦

所以,本质上,如果子类表中没有相应的行,超类表中就不可能存在行。最重要的是,如果子类表中没有相应的行,子类表中就不能存在行

显然,这几乎是不可能的,因为我们将无法插入或删除任何行

几天来我一直在想办法。既然我不能,我希望这里的人能引导我走上正确的道路

我只需要能够从一个查询中获得相同类型的子类


谢谢你的帮助

您可以使用延迟约束轻松实现这一点 例如:

你看过吗?听起来它会做你想做的,尽管它确实有一些。
 create table test
 (id serial primary key,
  child_id integer);

 create table test2
(id serial primary key,
 child_id integer references test(id) deferrable initially deferred);

 alter table test2 add constraint my_own_grandpa 
 foreign key (child_id) references test2(id) deferrable initially deferred;