gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 13:17:38 24 4
gpt4 key购买 nike

假设我们从应用的角度有以下需求:

Application requirements

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

要记住的主要事情是父类(super class)的实例必须是一个且只有一个子类。所以一个 SuperClass 实例不能同时是 SubClassA 和 SubClassB,并且 SuperClass 实例不能单独存在。
此外,同一类型属性的实例可以存在于多个子类中。例如,Type == 'Type1' 可以从 SubClassA 和 SubClassC 中获取多行。

基于此,我通常甚至不会创建 SuperClass 表。而只是像这样拥有各种 SubClass 表: Tables我只是在每个表中重复继承的属性。问题解决了。

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

SELECT PropertyA FROM SuperClass WHERE Type = 'Type1';

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

因此,从本质上讲,在子类表中没有相应行的情况下,父类(super class)表中不能存在一行。最重要的是,在 SuperClass 表中没有相应行的情况下,子类表中不能存在一行。

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

这几天我一直在努力寻找解决方案。既然我做不到,我希望这里有人能引导我走向正确的道路。

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

感谢您的帮助!

最佳答案

您可以使用延迟约束轻松地做到这一点示例:

 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;

关于sql - 如何设计两个相互依赖的表?也就是说,TableA 的行不能在 TableB 中没有行存在,反之亦然,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46700758/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com